iphone - UIView 未显示在 UIScrollView 中

标签 iphone objective-c ios uiscrollview uiimageview

我目前正在向我的 UIScrollView 对象动态添加一个 UIImage,一切都按预期工作。我现在需要添加额外的功能(从互联网加载时图像中心的 UIActivityIndi​​cator 和下面的标签)所以我想为什么不创建一个自定义 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

最佳答案

看起来好像CustomImageViewUIViewController 的子类, 不是 UIImageViewUIView .您不能添加 UIViewController作为这样的 subview 。将其更改为子类 UIView它应该有效。

加载UIView从 .nib,您需要声明您的 IBOutletUIViewController 一样的属性.在 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/

相关文章:

iphone - iOS 转换十六进制值

ios - 在容器 View 中无约束(自动布局)调整 subview Controller 的大小

ios - 使用 Swift 获取版本和构建信息

ios - 如何访问父 View Controller ?

iphone - 关于iphone中的Paypal支付? (说明如下)

iPhone 语音转文本和返回语音 API

iphone - 如何按整数对数组进行排序

ios - Objective-C如何在ARC代码中释放自己

ios - 添加和删​​除某个 UITableViewCell 下面的 UITableViewCell

ios - 有没有办法在没有代码的情况下制作 cocoa pod ,只是 repo 中已经编译的.framework?