分享

网络获取图片大小自适应

 叹落花 2015-01-11
最近在做一件事,就是将图片和文字显示到一起,是对纯文本和图片的处理。图片是要从网络上进行获取的,所以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:文本];
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约