我目前正在向我的 UIScrollView 对象动态添加一个 UIImage,一切都按预期工作。我现在需要添加额外的功能(从互联网加载时图像中心的 UIActivityIndicator 和下面的标签)所以我想为什么不创建一个自定义 View ,其中包含所有这些我需要的布局是,然后将其加载到 scrollView 中。但是我遇到了一个问题,当我将它添加到 scrollView 时,没有任何显示。这是我所拥有的:
NewsViewController.m:
imageScrollView.contentSize = CGSizeMake(320*numberOfPages, 303);
pageControl.numberOfPages = numberOfPages;
dispatch_queue_t imageDownload = dispatch_queue_create("imageDownload", NULL);
__block NSData *temp;
CustomImageView *customImageView = [[CustomImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 303)];
[imageScrollView addSubview:customImageView];
[[customImageView activityIndicator] startAnimating];
dispatch_async(imageDownload, ^{
temp = [[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.wlfarm.org/wp-content/uploads/2012/05/farm.jpg"]]retain];
dispatch_async(dispatch_get_main_queue(), ^{
customImageView.imageView.image = [[UIImage alloc] initWithData:temp];
[[customImageView activityIndicator] stopAnimating];
[customImageView setNeedsDisplay];
customImageView.caption.text = @"HAHAHAHAHHAHA";
[imageScrollView setNeedsDisplay];
[temp release];
});
});
dispatch_release(imageDownload);
自定义 ImageView .h:
#import <UIKit/UIKit.h>
@interface CustomImageView : UIView
{
IBOutlet UIImageView *imageView;
IBOutlet UILabel *caption;
IBOutlet UIActivityIndicatorView *activityIndicator;
}
@property (nonatomic, retain) IBOutlet UIImageView *imageView;
@property (nonatomic, retain) IBOutlet UILabel *caption;
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *activityIndicator;
@end
自定义 ImageView .m
#import "CustomImageView.h"
@interface CustomImageView ()
@end
@implementation CustomImageView
@synthesize caption, imageView, activityIndicator;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
我附上了我的 XIB 文件的屏幕截图,以及在模拟器上运行的程序。第一张图片在 ScrollView 中没有显示任何内容(使用我的自定义类进行的尝试), ScrollView 的第二页是通过将 UIImageView 添加到 UIScrollView(有效)进行的尝试。谁能指出我做错了什么?我不允许将自定义 View 加载到 UIScrollView 中吗?感谢您的帮助!
IB 截图 - http://i.stack.imgur.com/gz9UL.png
iOS 模拟器没有带有 CustomView 屏幕截图的图像 - http://i.stack.imgur.com/zhswq.png
带有 UIImageView 屏幕截图的 iOS 模拟器图像 - http://i.stack.imgur.com/97vmU.png
最佳答案
看起来好像CustomImageView
是 UIViewController
的子类, 不是 UIImageView
或 UIView
.您不能添加 UIViewController
作为这样的 subview 。将其更改为子类 UIView
它应该有效。
加载UIView
从 .nib,您需要声明您的 IBOutlet
与 UIViewController
一样的属性.在 IB 中定义正确的自定义类并将所有内容连接起来,包括基本 View 。然后在您的自定义 View 类中覆盖以下方法。
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code.
//
[[NSBundle mainBundle] loadNibNamed:@"<NIB NAME HERE>" owner:self options:nil];
[self addSubview:self.view];
}
return self;
}
您似乎已经从 UIViewController
中剪切并粘贴了方法子类化为你UIView
子类。首先删除您在 @synthesize
之间粘贴的所有方法和 @end
. UIView
子类需要不同的方法来从 .nib 加载,因此您需要重写上面显示的方法并使用代码行
[[NSBundle mainBundle] loadNibNamed:@"<NIB NAME HERE>" owner:self options:nil];
加载 Nib 。
关于您关于连接基本 View 的评论,这就是我的意思:
创建自定义类和 nib 文件后,打开 nib 并突出显示左侧的“文件所有者”,然后在右上角选择左起第三个图标,看起来像身份证或其他东西。在“类”框中,添加自定义类的名称。
在您的自定义类中,添加一个 IBOutlet UIView
名为baseView的属性,并在根级别添加一个覆盖IB中 View 的UIView,连接这两个。然后在上面添加其他所有内容
你的代码现在看起来像这样:
自定义 ImageView
#import <UIKit/UIKit.h>
@interface CustomImageView : UIView
{
IBOutlet UIView *baseView
IBOutlet UIImageView *imageView;
IBOutlet UILabel *caption;
IBOutlet UIActivityIndicatorView *activityIndicator;
}
@property (nonatomic, retain) IBOutlet UIView *baseView;
@property (nonatomic, retain) IBOutlet UIImageView *imageView;
@property (nonatomic, retain) IBOutlet UILabel *caption;
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *activityIndicator;
@end
自定义 ImageView .m
#import "CustomImageView.h"
@interface CustomImageView ()
@end
@implementation CustomImageView
@synthesize baseView, caption, imageView, activityIndicator;
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code.
//
[[NSBundle mainBundle] loadNibNamed:@"<NIB NAME HERE>" owner:self options:nil];
[self addSubview:self.baseView];
}
return self;
}
@end
如果你在 IB 中将它们全部连接起来,它应该可以正常工作,只记得添加 baseView
关于iphone - UIView 未显示在 UIScrollView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11627152/