最近在做一件事,就是将图片和文字显示到一起,是对纯文本和图片的处理。图片是要从网络上进行获取的,所以View要随着图片的获取来改变自己的大小。 这里面也小小的使用了一下block。 首先介绍一下三个基本类。 最底层的是获取图片的类。 #import <UIKit/UIKit.h> typedef void (^DBNetworkImageViewGetImage) (UIImage *image); @interface DBNetworkImageView : UIImageView { DBNetworkImageViewGetImage _block; } /** 初始化方法 @param block 主要用于获取图片 */ - (id)initWithFrame:(CGRect)frame block:(DBNetworkImageViewGetImage)block; @end #import "DBNetworkImageView.h" @implementation DBNetworkImageView - (id)initWithFrame:(CGRect)frame block:(DBNetworkImageViewGetImage)block; { self = [super initWithFrame:frame]; if(self != nil) { _block = Block_copy(block); } returnself; } - (void)dealloc { Block_release(_block); [super dealloc]; } - (void)setImage:(UIImage *)image { _block(image); } @end 这只是最基本的继承自UIImageView的子类,但是setImage:方法被重写了。 补充一下,我这里有UIImageView方法的补充类,可以直接设置图片的URL来异步获取图片,这块会在以后的文章中进行说明。 下面是最简单的显示一段文字和一张图片的类。 #import <UIKit/UIKit.h> #import "DBNetworkImageView.h" typedef void (^DBViewSetNeedsDisplay) (); @interface DBView : UIView { NSString *_textString; NSString *_imageURL; UIImage *_image; DBViewSetNeedsDisplay _block; DBNetworkImageView *_networkImageView; CGRect _originFrame; CGSize _size; CGSize _textSize; CGSize _imageSize; } /** 显示的文本信息 */ @property (copy, nonatomic) NSString *textString; /** 显示的图片路径,用于从网络上获取图片 */ @property (copy, nonatomic) NSString *imageURL; /** 显示的图片信息 */ @property (retain, nonatomic) UIImage *image; /** View的Size */ @property (assign, nonatomic) CGSize size; /** 初始化方法 @parma block 主要控制super view的动作 */ - (id)initWithFrame:(CGRect)frame block:(DBViewSetNeedsDisplay)block; @end #import "DBView.h" #import "UIImageView LXNetworkKit.h" @implementation DBView @synthesize textString = _textString; @synthesize imageURL =_imageURL; @synthesize image = _image; @synthesize size = _size; - (id)initWithFrame:(CGRect)frame block:(DBViewSetNeedsDisplay)block { self = [super initWithFrame:frame]; if (self) { // Initialization code self.backgroundColor = [UIColorclearColor]; _originFrame = CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height); _block = Block_copy(block); _size = CGSizeZero; _textSize = CGSizeZero; _imageSize = CGSizeZero; } returnself; } - (void)dealloc { [_textStringrelease]; [_imageURLrelease]; [_image release]; Block_release(_block); [super dealloc]; } // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code [_textStringdrawInRect:CGRectMake(0, 0, _textSize.width, _textSize.height) withFont:[UIFontsystemFontOfSize:12.0f]]; if(_image != nil) { [_imagedrawInRect:CGRectMake(0, _textSize.height, _imageSize.width, _imageSize.height)]; } _block(); } - (void)setTextString:(NSString *)string { if(_textString != nil) { [_textString release]; } _textString = [string copy]; CGSize size = [string sizeWithFont:[UIFontsystemFontOfSize:12.0f]]; _textSize = [string sizeWithFont:[UIFontsystemFontOfSize:12.0f] constrainedToSize:CGSizeMake(_originFrame.size.width, (size.width / _originFrame.size.width 1) * 20) lineBreakMode:UILineBreakModeWordWrap]; _size = CGSizeMake(_originFrame.size.width, _textSize.height _imageSize.height); if(_size.height > _originFrame.size.height) { _originFrame = CGRectMake(_originFrame.origin.x, _originFrame.origin.y, _originFrame.size.width, _size.height 12.0); self.frame = _originFrame; } [selfsetNeedsDisplay]; } - (void)setImageURL:(NSString *)imageURL { if(_imageURL != nil) { [_imageURL release]; } _imageURL = [imageURL copy]; if(_networkImageView == nil) { _networkImageView = [[[DBNetworkImageViewalloc] initWithFrame:CGRectZero block:^(UIImage *image) { [self setImage:image]; }] autorelease]; } [_networkImageViewsetImageWithURL:[NSURLURLWithString:imageURL]]; } - (void)setImage:(UIImage *)image { if(_image != nil) { [_image release]; } _image = [image retain]; if(_image != nil) { _imageSize = CGSizeMake(_originFrame.size.width, _image.size.height / _image.size.width * _originFrame.size.width); } _size = CGSizeMake(_originFrame.size.width, _textSize.height _imageSize.height); if(_size.height > _originFrame.size.height) { _originFrame = CGRectMake(_originFrame.origin.x, _originFrame.origin.y, _originFrame.size.width, _size.height 12.0); self.frame = _originFrame; } [selfsetNeedsDisplay]; } @end 其实整体机制很简单,就是在View直接描绘文字和图片,只要调用setImageURL:和setTextString:方法就会重新计算需要显示的大小,并对View的大小进行调整。 最后,由于View的大小可能会超出整个屏幕,所以用ScrollView来装载这些会自己调整大小的View。 #import <UIKit/UIKit.h> @interface DBScrollView : UIScrollView - (void)refreshAllSubviews; @end #import "DBScrollView.h" #import "DBView.h" @implementation DBScrollView - (void)refreshAllSubviews { NSArray *subviews = self.subviews; CGFloat height = 0.0; for(DBView *view in subviews) { view.frame = CGRectMake(0, height, view.frame.size.width, view.frame.size.height); height = view.size.height; } self.contentSize = CGSizeMake(self.frame.size.width, height); } @end 少加了一段代码,就是再向ScrollView添加DBView的对象直接设置block函数为下面这种形式: _textScrollView = [[[DBScrollViewalloc] initWithFrame:CGRectMake(10, 75, 300, 336)] autorelease]; [self.view addSubview:_textScrollView]; _dbView = [[[DBView alloc] initWithFrame:CGRectMake(0, 0, 300, 336) block:^{ [_textScrollViewrefreshAllSubviews]; }] autorelease]; [_textScrollViewaddSubview:_dbView]; [_dbViewsetTextString:文本]; |
|