问题:在首页的navigationBar有张图片,需要填充整个顶部。由于刘海屏顶部会多出24的高度,88高度的图在iPhoneX机型是正常的,放在iPhone8上能感到明显的压缩,这是不能让人接受的,设计说顶部多出的尺寸可以裁剪掉,但不能压缩。
我的第一个思考:改变填充方式就好了。
第一张是高度375*88,图片尺寸是@2x,@3x.所以纵向是没有拉伸的。
ScaleToFill是默认拉伸,会变形不会留白。
ScaleAspectFit是按比例压缩,会留白。
ScaleAspectFill是等比例填充,超出部分裁剪掉。
ModeTop、ModeCenter、ModeBottom是分别从顶部、中间、底部拉伸,但横向就不会填充了。也就是说375的图在414的宽度上会留白。如果横向也能铺满,结合ModeBottom的方式就是理想的拉伸方式了。然而属性不能同时设置两个。
resizableImageWithCapInsets在网上看到这个方法,可以按想要的部分进行填充。就是小图显示大view的方法,与我想要的刚好相反。
填充的办法不能实现理想的填充方式,我也想到了两套图,完美解决。实现起来也简单,然而考虑到后期的维护,也要考虑到美工的工作量。果断放弃了。
最后从根源上分析,iPhoneX整个导航栏高度是88,iPhone8的高度是64,也就是说拿到iPhoneX的图需要裁减掉88-64=24的高度。下面是裁减图片的方法:
- (UIImage*)cutOutImageWithRect:(CGPoint)point image:(UIImage *)image{
CGFloat imageWidth = CGImageGetWidth(image.CGImage);
CGFloat imageHeight = CGImageGetHeight(image.CGImage);
CGRect rect = CGRectMake(point.x*image.scale, point.y*image.scale, imageWidth-point.x*image.scale, imageHeight-point.y*image.scale);
CGImageRef subImageRef = CGImageCreateWithImageInRect(image.CGImage, rect);
CGRect smallBounds = CGRectMake(0, 0, CGImageGetWidth(subImageRef), CGImageGetHeight(subImageRef));
UIGraphicsBeginImageContext(smallBounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, smallBounds, subImageRef);
UIImage* smallImage = [UIImage imageWithCGImage:subImageRef];
UIGraphicsEndImageContext();
CGImageRelease(subImageRef);
return smallImage;
}
总结:
1.我的主题包是从后台下载的,所以在下载解压之后裁减图片再写回去,以后使用的时候就不用考虑尺寸了
2.裁减图片时需要考虑图片是@2x还是@3x,真正裁减的是像素,再按原来的名称写回去。我们在一个机型上只需要处理@2x或@3x就可以了。
3.使用CGImageCreateWithImageInRect方法一定要记得释放,要不然会内存泄露。
4.最后贴上一张处理完的图。横向还是有拉伸的,不过不明显,因为现在的尺寸都是按iPhone6来的。真正的不拉伸,还是大图裁小图。
5.提供一种解决思路:有任何好的解决办法或有任何问题欢迎留言评论。