問題:在首頁的navigationBar有張圖片低散,需要填充整個頂部。由于劉海屏頂部會多出24的高度,88高度的圖在iPhoneX機型是正常的,放在iPhone8上能感到明顯的壓縮驾孔,這是不能讓人接受的,設(shè)計說頂部多出的尺寸可以裁剪掉进统,但不能壓縮助币。
我的第一個思考:改變填充方式就好了。
??第一張是高度375*88螟碎,圖片尺寸是@2x,@3x.所以縱向是沒有拉伸的。
??ScaleToFill是默認(rèn)拉伸,會變形不會留白迹栓。
??ScaleAspectFit是按比例壓縮掉分,會留白。
??ScaleAspectFill是等比例填充克伊,超出部分裁剪掉酥郭。
??ModeTop、ModeCenter愿吹、ModeBottom是分別從頂部不从、中間、底部拉伸犁跪,但橫向就不會填充了椿息。也就是說375的圖在414的寬度上會留白。如果橫向也能鋪滿坷衍,結(jié)合ModeBottom的方式就是理想的拉伸方式了寝优。然而屬性不能同時設(shè)置兩個。
??resizableImageWithCapInsets在網(wǎng)上看到這個方法,可以按想要的部分進行填充枫耳。就是小圖顯示大view的方法乏矾,與我想要的剛好相反。
??填充的辦法不能實現(xiàn)理想的填充方式,我也想到了兩套圖钻心,完美解決凄硼。實現(xiàn)起來也簡單,然而考慮到后期的維護捷沸,也要考慮到美工的工作量帆喇。果斷放棄了。
??最后從根源上分析亿胸,iPhoneX整個導(dǎo)航欄高度是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;
}
總結(jié):
1.我的主題包是從后臺下載的,所以在下載解壓之后裁減圖片再寫回去侈玄,以后使用的時候就不用考慮尺寸了
2.裁減圖片時需要考慮圖片是@2x還是@3x婉刀,真正裁減的是像素,再按原來的名稱寫回去。我們在一個機型上只需要處理@2x或@3x就可以了序仙。
3.使用CGImageCreateWithImageInRect方法一定要記得釋放突颊,要不然會內(nèi)存泄露。
4.最后貼上一張?zhí)幚硗甑膱D潘悼。橫向還是有拉伸的律秃,不過不明顯,因為現(xiàn)在的尺寸都是按iPhone6來的治唤。真正的不拉伸棒动,還是大圖裁小圖。
5.提供一種解決思路:有任何好的解決辦法或有任何問題歡迎留言評論宾添。