iOS 图片拉伸’S 二三事

今天咱们讲述的是图片相关问题。而在开发中总会遇到图片拉伸问题。通常状况下会有以下的处理方式:
1.因为加载的图片是网络图片,咱们通常都会去改变的是UIImageViewcontentMode属性。而且也提供了好多种显示模式,咱们能够根据相关的需求,调整不一样的电视模式。网络

typedef NS_ENUM(NSInteger, UIViewContentMode) {
    UIViewContentModeScaleToFill,         // 默认 拉伸(会变形)
    UIViewContentModeScaleAspectFit,      // 等比例拉伸
    UIViewContentModeScaleAspectFill,     // 等比例填充
    UIViewContentModeRedraw,              // redraw on bounds change (这个不清楚) 
    UIViewContentModeCenter,              // 下面的就是不拉伸按位置显示了
    UIViewContentModeTop,
    UIViewContentModeBottom,
    UIViewContentModeLeft,
    UIViewContentModeRight,
    UIViewContentModeTopLeft,
    UIViewContentModeTopRight,
    UIViewContentModeBottomLeft,
    UIViewContentModeBottomRight,
};
复制代码

2.图片的四个角不拉伸,让中间的区域去拉伸。在开发中,作聊气泡的时候用到的比较多。这样的问题有两种方法。 第一种测试

// 按4边间距显示不拉伸的区域
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets NS_AVAILABLE_IOS(5_0); 
复制代码

这个方法的使用网上能够找到不少。这里就很少叙述。
第二种,本地图片咱们都放在项目中的Assets.xcassets中,咱们点击想要拉伸的图片,而后点击右下角的Show Slicing按钮 ui


点击那个选择框,会有以下选项

None
Horizonta
Vertical
Horizonta and Vertical
复制代码

咱们是作聊天气泡的 因此我就选择了Horizonta and Vertical
可是今天主要的不是上面哪两种拉伸状况,如今出现了第三种那就是中间部分不拉伸,两边的部分拉伸就好了。 spa

就像是这样的,中间凹陷 的部分不能由于拉伸而变形,一开始咱们想的是由于iOS这边的机型比较固定,能够根据机型的判断来调取不一样尺寸的图片,可是这样的弊端就是 若是之后除了一种如今并不存在的机型,那么就要发版本。这样不是很灵活。因此我就上网找了好多的办法,看看有没有中间不拉伸两边拉伸的方案。 虽然没有一步到位的方案,可是也找到了解决办法,那就是退图片作二次拉伸,从而达到俺想要的效果。废话不错说,直接上代码

- (UIImage *)doubleStretchLeftAndRightWithContainerSize:(CGSize)size image:(UIImage *)oraimage
{
    CGSize imageSize = oraimage.size;
    CGSize bgSize = size;
    
    //1.第一次拉伸右边 保护左边
    UIImage *image = [oraimage stretchableImageWithLeftCapWidth:imageSize.width -1 topCapHeight:0];
    
    //第一次拉伸的距离以后图片总宽度
    CGFloat tempWidth = (bgSize.width)/2 + imageSize.width/2;
    
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(tempWidth, imageSize.height), NO, [UIScreen mainScreen].scale);
    
    [image drawInRect:CGRectMake(0, 0, tempWidth, bgSize.height)];
    
    //拿到拉伸过的图片
    UIImage *firstStrechImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    //2.第二次拉伸左边 保护右边
    UIImage *secondStrechImage = [firstStrechImage stretchableImageWithLeftCapWidth:firstStrechImage.size.width *0.2 topCapHeight:0];
    
    return secondStrechImage;
}
复制代码

通过测试,这样就能够解决中间凹陷部分不变形的问题了3d

相关文章
相关标签/搜索