1

我目前正在动态地将 UIImage 添加到我的 UIScrollView 对象中,并且一切都按预期工作。我现在需要添加额外的功能(从互联网加载时图像中心的 UIActivityIndi​​cator 和下方的标签)所以我想为什么不创建一个自定义视图,其中包含我需要的所有这些布局是,然后将其加载到滚动视图中。但是我遇到了一个问题,当我将它添加到scrollView时,什么都没有出现。这是我所拥有的:

新闻视图控制器.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);

CustomImageView.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

自定义图像视图.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 文件的屏幕截图,以及在模拟器上运行的程序。第一张图片在滚动视图中没有显示任何内容(使用我的自定义类进行的尝试),滚动视图的第二页是通过将 UIImageView 添加到 UIScrollView 进行的尝试(有效)。谁能指出我做错了什么?我不允许将自定义视图加载到 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

4

2 回答 2

1

看起来好像CustomImageView是 on UIViewController, not UIImageViewor的子类UIView。您不能像那样添加 aUIViewController作为子视图。将其更改为子类UIView,它应该可以工作。

要从 .nib 加载 a UIView,您需要像声明 .nibIBOutlet一样声明属性UIViewController。在 IB 中定义正确的自定义类并连接所有内容,包括基本视图。然后在您的自定义视图类中覆盖以下方法。

- (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 文件后,打开 nib 并突出显示左侧的“文件所有者”,然后在右上角,选择左侧第三个图标,看起来像身份证或其他东西。在“类”框中,添加自定义类的名称。

在你的customClass中,添加一个IBOutlet UIView名为baseView的属性,并在根级别添加一个覆盖IB中视图的UIView,将这两者连接起来。然后在上面添加其他所有内容

你的代码现在看起来像这样:

CustomImageView.h

#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

自定义图像视图.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

于 2012-07-24T09:42:14.877 回答
0

如前所述,initWithNibName属于控制器。
在我看来,你走错路了。

您有一个 ViewController 并想要添加一个 customView,以从 URLData 动态加载图像。

您有 2 个选项:
选项 1: 在 IB 中执行所有操作:
在 Interfacebuilder 中编辑/(或添加新的)ViewController 的 XIB 文件并添加您喜欢的视图。该文件的所有者是一个 UIViewController 类/子类。像以前一样做所有事情,除了在视图控制器中做。在您的 App 委托 initWithNibName 中,您的 ViewController 像这样

    self.viewController = [[testViewController alloc] initWithNibName:@"testViewController" bundle:nil];

如果您愿意,请初始化您自己的视图控制器,您希望将其推送并推送到堆栈中。

您做错了什么:您正在使用 Frame 初始化 customImageView,但笔尖不会自动加载。属性在那里,但笔尖不在。

如果您真的想要一个稳定的东西,请选择
选项 2:以编程方式执行所有操作(更容易、更易于理解且轻量级):
从您的实现中,我们执行以下操作:

新闻视图控制器.m

像以前那样做!!!

CustomImageView.h:

#import <UIKit/UIKit.h>

@interface CustomImageView : UIView
{
    UIImageView *imageView;
    UILabel *caption;
    UIActivityIndicatorView *activityIndicator;
}

@property (nonatomic, retain) UIImageView *imageView;
@property (nonatomic, retain) UILabel *caption;
@property (nonatomic, retain) UIActivityIndicatorView *activityIndicator;
@end

自定义图像视图.m:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        caption = [[UILabel alloc] initWithFrame:CGRectMake(0, 250, 320, 50)];
        [caption setBackgroundColor:[UIColor greenColor]];
        imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 250)];
        [imageView setBackgroundColor:[UIColor blueColor]];
        activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
        self.activityIndicator.frame = CGRectMake(320/2-25, 460/2-25, 50, 50);
        [self.activityIndicator startAnimating];


        [self addSubview:self.caption];
        [self addSubview:self.imageView];
        [self addSubview:self.activityIndicator];
    }
    return self;
}

然后做你以前做过的一切。那会做得更好

于 2012-07-24T10:57:12.523 回答