2013-03-18 62 views
1

我想开发一个库,它需要一个图像数组,并返回一个scrollView与图像并排。UIImageView没有添加到UIView

但是,当我添加此scrollView,我回到我的主视图,它不会添加图像。图像是正确的。

我的想法是并排使用每个图像的滚动视图,并使用滚动条来显示幻灯片。首先,这个概念好吗?

其次,我不明白为什么我在模拟器中运行应用程序时不显示图像。

需要更多的细节请询问。

代码如下。 我的头文件:

#import <UIKit/UIKit.h> 

@interface HCIImageSlideShowView : UIScrollView 

-(void) setImages:(NSArray*) imagesArray; 
-(void) setBounds:(CGRect)bounds; 
-(void) setCaptions:(NSArray*) imageCaptionsArray; 

-(void) isEditable:(BOOL)edit; 

-(void) setSlideTime:(int) milliSeconds; 

-(void) startSlideShow; 

- (id) initWithImages:(NSArray*)imagesArray captionsArray:(NSArray*) captionArray 
       bounds:(CGRect)bounds slideTime:(int)milliSeconds; 

@end 

我实现文件:

#import "HCIImageSlideShowView.h" 
#import "HCIResultListViewController.h" 

@interface HCIImageSlideShowView() 

@property (strong,nonatomic) NSMutableArray *imagesArray; 
@property BOOL editable; 
@property (nonatomic) int slideTime; 
@property (strong,nonatomic) NSMutableArray *imageCaptionsArray; 
@property CGFloat width; 

@end 


@implementation HCIImageSlideShowView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

- (id) initWithImages:(NSArray*)imagesArray captionsArray:(NSArray*) captionArray 
       bounds:(CGRect)bounds slideTime:(int)milliSeconds 
{ 

    NSLog([NSString stringWithFormat:@"%f,%f", bounds.size.width , bounds.size.height]); 

    CGFloat width_t = bounds.size.width; 

    bounds.size.width = [imagesArray count] * bounds.size.width; 

    self = [[HCIImageSlideShowView alloc] initWithFrame:bounds]; 

    _width = width_t; 

    [self setBackgroundColor:[[UIColor alloc] initWithRed:0.2 green:0.1 blue:0.3 alpha:0.4]]; 

    if (self) { 
     [self setImages:imagesArray]; 
     [self setSlideTime:milliSeconds]; 
     [self setCaptions:captionArray]; 
     [self defaultLoad]; 
    } 

    self.scrollEnabled = YES; 

    return self; 
} 

-(void) defaultLoad 
{ 

    NSLog([NSString stringWithFormat:@"%f,%f,%f",_width,self.bounds.size.height,self.bounds.size.width]); 

    for (int i = 0; i < [_imagesArray count]; i++) { 
     CGRect imageBounds = CGRectMake(i * _width, self.bounds.size.height, _width, self.bounds.size.height); 
     UIImageView *imageView = [[UIImageView alloc] initWithFrame:imageBounds]; 
     [imageView setImage:[HCIResultListViewController resizeImage:_imagesArray[i] withWidth:_width withHeight:self.bounds.size.height]]; 
     NSLog([NSString stringWithFormat:@"%f,%f",imageView.bounds.size.height,imageView.bounds.size.width]); 
     [self addSubview:imageView]; 
    } 

} 

-(void) setBounds:(CGRect)bounds 
{ 
    self.bounds = bounds; 
} 

-(void) setImages:(NSArray *)imagesArray 
{ 
    _imagesArray = [[NSMutableArray alloc] initWithArray:imagesArray]; 
} 

-(void) setSlideTime:(int)milliSeconds 
{ 
    _slideTime = milliSeconds; 
} 

-(void) startSlideShow 
{ 

} 

-(void) isEditable:(BOOL)edit 
{ 
    _editable = edit; 
} 

-(void) setCaptions:(NSArray *)imageCaptionsArray { 
    _imageCaptionsArray = [[NSMutableArray alloc] initWithArray:imageCaptionsArray]; 
} 

@end 
+0

检查你的自我是否得到建立与否,如果(个体经营)条件语句旁边写着setBackgroundColor – Mrunal 2013-03-18 13:40:30

+0

为什么你的init方法中分配一个新HCIImageSlideShowView对象? AFAIK只需调用'self = [super initWithFrame:...];应该就足够了''根据你对'self'返回的内容以及你是否使用IB,这可能是好的。但是你冒险最终得到两个HCIImageSlideShowView,一个设置正确但没有显示,另一个显示为空。 – 2013-03-18 13:42:22

+0

是的。自我正在创造。在屏幕上它实际上显示背景颜色。但是,图像不显示。滚动条都没有。 – 2013-03-18 13:42:34

回答

2

似乎有很多你的代码错误 - 尤其是你的初始化器。下面是一个注释版本

@interface HCIImageSlideShowView : UIScrollView 


-(void) startSlideShow; 

- (id) initWithImages:(NSArray*)imagesArray captionsArray:(NSArray*) captionArray 
       bounds:(CGRect)bounds slideTime:(int)milliSeconds; 
    /* 
    remove this custom initialiser as it is quite wrong. 
    Use the default initialiser (don't override) 
    then set the properties after you have created the object. 
    */ 


    /* Remove all of your custom setters. 
    If any of these properties need setting outside of the class, 
    move the property declarations to the .h file. 
    */ 

    -(void) setImages:(NSArray*) imagesArray; 
    -(void) setBounds:(CGRect)bounds; 
    -(void) setCaptions:(NSArray*) imageCaptionsArray; 

    -(void) isEditable:(BOOL)edit; 

    -(void) setSlideTime:(int) milliSeconds; 

@end 



    #import "HCIImageSlideShowView.h" 
    #import "HCIResultListViewController.h" 

@interface HCIImageSlideShowView() 
/* 
make these properties public by moving them to your .h file 
so that you can set them from the calling object 
*/ 
@property (strong,nonatomic) NSMutableArray *imagesArray; 
@property BOOL editable; 
@property (nonatomic) int slideTime; 
@property (strong,nonatomic) NSMutableArray *imageCaptionsArray; 
@property CGFloat width; 
@end 

@implementation HCIImageSlideShowView 

- (id) initWithImages:(NSArray*)imagesArray captionsArray:(NSArray*) captionArray 
       bounds:(CGRect)bounds slideTime:(int)milliSeconds 
/* 
    You seem to be getting confused with init, 
    so I suggest you do not make a custom init method at all. 
    Initialise your object with the default initWithFrame, 
    then have the caller set properties on your newly 
     made object after initiliasation. 

*/ 

{ 
    NSLog([NSString stringWithFormat:@"%f,%f", bounds.size.width , bounds.size.height]); 
    /* 
     This is the way to use NSLog... 
     NSLog(@"%f,%f", bounds.size.width , bounds.size.height); 
    */ 

    CGFloat width_t = bounds.size.width; 
    /* 
    double assignment: two lines further down you assign 
    width_t to _width. You can do that here in one step 
    */ 

    bounds.size.width = [imagesArray count] * bounds.size.width; 

    self = [[HCIImageSlideShowView alloc] initWithFrame:bounds]; 

    /* 
    This is wrong. Although as Hermann says it may be _legal_, don't do it! 
     -Never alloc an object inside it's own initialiser. 
     The memory will already have been alloc'd by the caller. 
     - Never assign to self anything but the return value from super's init. 
    */ 

    _width = width_t; 

    /* 
    please be consistent with your iVar/property naming. 
    Here you are addressing the ivar _width, 2 lines up 
    you are using the property accessor syntax self.bounds. 
    In you case I would recommend ALWAYS using self.varName 
    except inside a custom setter or getter. 
    */ 

    [self setBackgroundColor:[[UIColor alloc] initWithRed:0.2 green:0.1 blue:0.3 alpha:0.4]]; 

    if (self) { 
      //[self setImages:imagesArray]; 
     self.imagesArray = [imagesArray mutableCopy]; 

      //[self setSlideTime:milliSeconds]; 
     self.slideTime = milliSeconds; 

      //[self setCaptions:captionArray]; 
     self.imageCaptionsArray = [captionArray mutableCopy]; 

     /* 
     As my comment above - use property syntax and try to 
     avoid writing your own setters and getters 
     unless you have a very good reason. 
     */ 

     [self defaultLoad]; 
    } 

    self.scrollEnabled = YES; 

    return self; 
} 

当你的初始化代码需要一些清理,我也没太仔细地看defaultLoad - 但是我确实有一对夫妇的意见...

(1)

CGRect imageBounds = CGRectMake(i * _width, self.bounds.size.height, _width, self.bounds.size.height); 

应该

CGRect imageBounds = CGRectMake(i * _width,0, _width, self.bounds.size.height); 

否则你的图片都是PL在您的scrollView的高度下方脱离屏幕。

(2)

您需要设置一个contentSize使滚动视图可以滚动

[scrollView setContentSize:(CGSize){self.width*[imageArray count],self.bounds.size.height}]; 

其他更普遍的评论是,这是一些图片OK,但你不会想要制作一个带有大量屏幕imageViews的scrollView,因为你会吃掉内存。您实际上只需要三个,即屏幕上当前的图像,以及左侧和右侧的前一个和下一个图像。这个想法是只在你可能需要它们的时候加载你的图像,并且像tableView那样回收你的imageViews。

你应该与它的伴随WWDC 2010/11视频(S)和slides一起看看Apple's Photoscroller sample app

不要担心所有的平铺和缩放的细节,这是很好的得到的一般原则将对象创建保持在最低限度,并在可行的情况下回收/再利用对象。顺便说一句,你可能根本不需要自定义的scrollView对象:你可以在调用viewController对象的几行代码中实现大部分的功能。例如...

- (void) viewDidLoad { 
     [super viewDidLoad]; 
    UIScrollView* scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; 
    [scrollView setBackgroundColor:[UIColor redColor]]; 
    NSArray* imageArray = @[[UIImage imageNamed:@"image1.png"] 
          ,[UIImage imageNamed:@"image2.png"] 
          ,[UIImage imageNamed:@"image3.png"] 
          ]; 
    CGFloat width = scrollView.bounds.size.width; 
    CGFloat height = scrollView.bounds.size.height; 

    for (int i = 0; i < [imageArray count]; i++) { 
     CGRect imageFrame = CGRectMake(i * width, 0, width, height); 
     UIImageView *imageView = [[UIImageView alloc] initWithFrame:imageFrame]; 
     [imageView setImage:imageArray[i]]; 
     [scrollView addSubview:imageView]; 
    } 
    [scrollView setContentSize:(CGSize){width*[imageArray count],height}]; 
    [self.view addSubview:scrollView]; 
} 
0
- (id) initWithImages:(NSArray*)imagesArray captionsArray:(NSArray*) captionArray 
       bounds:(CGRect)bounds slideTime:(int)milliSeconds 
{ 

    NSLog([NSString stringWithFormat:@"%f,%f", bounds.size.width , bounds.size.height]); 

    CGFloat width_t = bounds.size.width; 

    bounds.size.width = [imagesArray count] * bounds.size.width; 

    self = [self initWithFrame:bounds]; 

    _width = width_t; 

    [self setBackgroundColor:[[UIColor alloc] initWithRed:0.2 green:0.1 blue:0.3 alpha:0.4]]; 

    if (self) { 
     [self setImages:imagesArray]; 
     [self setSlideTime:milliSeconds]; 
     [self setCaptions:captionArray]; 
     [self defaultLoad]; 
    } 

    self.scrollEnabled = YES; 

    return self; 
} 
+0

感谢您的更改,但仍然无法解决我的问题。图像未显示。实际上通过设置imageview的背景颜色,我开始知道不会添加hte UIImageView。这可以帮助什么吗? – 2013-03-18 14:13:41

+0

那么我会检查[HCIResultListViewController resizeImage:...]在defaultLoad循环中的输出。它真的返回一个UIImage对象吗?是否有适当的UIImage对象交给? – 2013-03-18 14:51:06

相关问题