ios 开发iOSiOS-学习笔记

iOS -- 图片处理

2015-11-12  本文已影响3739人  iOS_成才录

一、目录

二、应用逻辑处理

2.1 图片拉伸处理

iOS5以前
    // LeftCapWidth: 左边多少不能拉伸
    // 右边多少不能拉伸 = 控件的宽度 - 左边多少不能拉伸 - 1
    //  right  =  width - leftCapWidth - 1
    // 1 = width - leftCapWidth - right

    // topCapHeight: 顶部多少不能拉伸
    // 底部有多少不能拉伸 = 控件的高度 - 顶部多少不能拉伸 - 1
    //  bottom =  height - topCapWidth - 1
    // 1 = height - topCapWidth - bottom
    UIImage *newImage = [image stretchableImageWithLeftCapWidth:5 topCapHeight:5];

 [btn setBackgroundImage:newImage forState:UIControlStateNormal];  
   btn.frame = CGRectMake(100, 100, 200, 80);
   [self.view addSubview:btn];
iOS5开始
    // UIEdgeInsets是告诉系统哪些地方需要受保护, 也就是不可以拉伸
    // resizableImageWithCapInsets默认拉伸方式是平铺
    UIEdgeInsets insets = UIEdgeInsetsMake(image.size.height * 0.5, image.size.width * 0.5, image.size.height * 0.5, image.size.width * 0.5);
    UIImage *newImage =  [image resizableImageWithCapInsets:insets];
[btn setBackgroundImage:newImage forState:UIControlStateNormal];
 btn.frame = CGRectMake(100, 100, 200, 80);
 [self.view addSubview:btn];
iOS6开始
    // resizingMode指定拉伸模式
    // 平铺
    // 拉伸
    UIEdgeInsets insets = UIEdgeInsetsMake(5, 5, 5, 5);
    UIImage *newImage =  [image resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch];
    [btn setBackgroundImage:newImage forState:UIControlStateNormal];
    btn.frame = CGRectMake(100, 100, 200, 80);
    [self.view addSubview:btn];

2.2 图片扩展名

2.3 大图减小高度,图片拉伸处理

需求:如果图片太大,则高度减小点,控制图片高度,保证图片不被拉伸
Snip20150916_52.png
  if (是大图) {
        // 是大图,内容模型为顶部对齐
        self.imageView.contentMode = UIViewContentModeTop;
        self.imageView.clipsToBounds = YES; // 裁剪
    } else {
        // 不是大图,填充模型
        self.imageView.contentMode = UIViewContentModeScaleToFill; 
        self.imageView.clipsToBounds = NO; // 不裁剪
    }

2.4 点击大图,Modal出来,查看大图控制器

2.5 cell上面的图片圆角设置

方案一:图层layer
@implementation JPCell
- (void)awakeFromNib
{
    // 如果使用过于频繁,可能会导致拖拽起来的感觉比较卡
     self.imageListView.layer.cornerRadius = self.imageListView.width * 0.5;
     self.imageListView.layer.masksToBounds = YES;
}
@end
方案二:Quartz2D裁剪图片
#import <UIKit/UIKit.h>

@interface UIImage (JPExtension)
/**
 * 返回一张圆形图片
 */
- (instancetype)circleImage;

/**
 * 返回一张圆形图片
 */
+ (instancetype)circleImageNamed:(NSString *)name;
@end

#import "UIImage+JPExtension.h"

@implementation UIImage (JPExtension)
- (instancetype)circleImage
{
    // 开启图形上下文
    UIGraphicsBeginImageContext(self.size);
    
    // 获得上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 矩形框
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    
    // 添加一个圆
    CGContextAddEllipseInRect(ctx, rect);
    
    // 裁剪(裁剪成刚才添加的图形形状)
    CGContextClip(ctx);
    
    // 往圆上面画一张图片
    [self drawInRect:rect];
    
    // 获得上下文中的图片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    // 关闭图形上下文
    UIGraphicsEndImageContext();
    return image;
}

+ (instancetype)circleImageNamed:(NSString *)name
{
    return [[self imageNamed:name] circleImage];
}
@end

2.6 思考:APP中所有头像都设置为圆角,如何抽取?

#import <UIKit/UIKit.h>

@interface UIImageView (JPExtension)
/**
 * 设置头像
 */
- (void)setHeader:(NSString *)url;
@end

#import "UIImageView+JPExtension.h"
#import <UIImageView+WebCache.h>

@implementation UIImageView (JPExtension)
- (void)setHeader:(NSString *)url
{
    [self setCircleHeader:url];
}

- (void)setRectHeader:(NSString *)url
{
    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"defaultUserIcon"]];
}

- (void)setCircleHeader:(NSString *)url
{
    JPWeakSelf;
    UIImage *placeholder = [[UIImage imageNamed:@"defaultUserIcon"] circleImage]; // 使用了上面的一个分类,裁剪圆角图片返回
    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeholder completed:
     ^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
       // 如果图片下载失败,就不做任何处理,按照默认的做法:会显示占位图片
       if (image == nil) return;
       weakSelf.image = [image circleImage];
   }];
}
@end
上一篇 下一篇

猜你喜欢

热点阅读