一同养成写作习气!这是我参加「日新计划 4 月更文挑战」的第29天,点击检查活动详情。
引言
I 图片的加载方法
1.1 本地图片加载方法
假如图片比较小,而且运用十分频频,可以运用imageName:
(eg icon),假如图片比较大,而且运用比较少,可以运用initWithContentsOfFile
:(eg 引导页 相册)。
-
initWithContentsOfFile
和dataWithContentsOfFile
: 优先挑选3x图画,而不是2x图画时运用
NSString *path = [[NSBundle mainBundle] pathForResource:@"smallcat" ofType:@"png"];
UIImage *image = [[UIImage alloc]initWithContentsOfFile:path];
// 在ipone5 s、iphone6和iphone6 plus都是优先加载@3x的图片,假如没有@3x的图片,就优先加载@2x的图片
dataWithContentsOfFile
NSData* hdImageData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"shareicon" ofType:@"png"]];
-
[UIImage imageNamed:@"smallcat"]
: 优先加载@2x的图片
iphone5s和iphone6优先加载@2x的图片,iphone6 plus是加载@3x的图片。
1.2 加载方法的挑选
imageWithContentsOfFile:
的特色:
- 当目标毁掉的时分,图片占用的内存会跟着一同毁掉
- 加载的图片占用的内存较小
- 相同的图片假如被屡次加载就会占有多个内存空间
imageWithContentsOfFile 只能加载到自定义的图片办理途径中的图片资源,加载不到Assets目录下的图片。
imageNamed
的特色:
- 当目标毁掉的时分,图片占用的内存不会跟着一同毁掉,内存由系统来办理,程序员不行控制
- 加载的图片,占用的内存十分大
- 相同的图片不会被重复加载到内存
imageWithName既可以加载Assets目录下的资源也可以加载项目自定义的图片文件途径,区别是 :
-
加载Assets目录下的图片对格局有要求,有必要是png格局。
-
加载自定义图片途径时不能简写图片名,需要带上图片的扩展名。
1.3 社会化共享小程序时,高清封面的加载
图片的加载方法的运用比如: 社会化共享小程序时,高清封面的加载。
blog.csdn.net/z929118967/…
常见问题: 小程序封面不显现
原因:imageWithContentsOfFile
加载不到Assets目录下的图片,所以hdImageData为空。
解决方法: 将图片存储在自定义图片途径,不要放在Assets目录。
imageWithName既可以加载Assets目录下的资源也可以加载项目自定义的图片文件途径,区别是 :
-
加载Assets目录下的图片对格局有要求,有必要是png格局。
-
加载自定义图片途径时不能简写图片名,需要带上图片的扩展名。
imageWithContentsOfFile 只能加载到自定义的图片办理途径中的图片资源,加载不到Assets目录下的图片。
NSData* hdImageData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"shareicon" ofType:@"png"]];
作用:
II 内容形式
首先了解下图片的内容形式
2.1 内容形式
- UIViewContentModeScaleToFill
拉伸图片至填充整个UIImageView,图片的显现尺度会和imageVew的尺度一样 。 This will scale the image inside the image view to fill the entire boundaries of the image view.
- UIViewContentModeScaleAspectFit
图片的显现尺度不能超过imageView尺度巨细 This will make sure the image inside the image view will have the right aspect ratio and fits inside the image view’s boundaries.
- UIViewContentModeScaleAspectFill
依照图片的本来宽高比进行缩放(展示图片最中心的内容),合作运用
tmpView.layer.masksToBounds = YES;
This will makes sure the image inside the image view will have the right aspect ratio and fills the entire boundaries of the image view. For this value to work properly, make sure that you have set the clipsToBounds property of the image view to YES.
- UIViewContentModeScaleToFill : 直接拉伸图片至填充整个imageView
划重点:
- UIViewContentModeScaleAspectFit : 依照图片的本来宽高比进行缩放(一定要看到整张图片)
运用场景:信用卡图片的展示
- UIViewContentModeScaleAspectFill : 依照图片的本来宽高比进行缩放(只能图片最中心的内容)
引导页通常采用UIViewContentModeScaleAspectFill
// 内容形式
self.contentMode = UIViewContentModeScaleAspectFill;
// 超出边框的内容都剪掉
self.clipsToBounds = YES;
2.2 比如:产品详情页的完成
-
产品详情页(依照图片原宽高份额显现图片全部内容,并主动适应高度)
-
背景图片的拉伸(中心空白的小矩形设置为可拉伸,确保有形状的当地不进行缩放)
- (void)awakeFromNib
{
[super awakeFromNib];
// 拉伸
// self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg_dealcell"]];
// 平铺
// self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bg_dealcell"]];
[self setAutoresizingMask:UIViewAutoresizingNone];
}
- (void)drawRect:(CGRect)rect
{
// 平铺
// [[UIImage imageNamed:@"bg_dealcell"] drawAsPatternInRect:rect];
// 拉伸
[[UIImage imageNamed:@"bg_dealcell"] drawInRect:rect];
}
背景图片的拉伸(中心空白的小矩形设置为可拉伸,确保有形状的当地不进行缩放)
UIImage *resizableImage = [image resizableImageWithCapInsets:UIEdgeInsetsMake(heightForLeftORRight, widthForTopORBottom, heightForLeftORRight, widthForTopORBottom)];
III 图片的平铺和拉伸
//
#import "UIImage+ResizableImage.h"
@implementation UIImage (ResizableImage)
+ (UIImage*)resizableImageWithName:(NSString *)name {
NSLog(@"%s--%@",__func__,name);
UIImage *image = [UIImage imageNamed:name];
//裁剪图片方法一:
//Creates and returns a new image object with the specified cap values.
/*right cap is calculated as width - leftCapWidth - 1
bottom cap is calculated as height - topCapWidth - 1
*/
return [image stretchableImageWithLeftCapWidth:image.size.width*0.5 topCapHeight:image.size.height*0.5];
//方法二:
// CGFloat top = image.size.width*0.5f-1;
// CGFloat left = image.size.height*0.5f-1;
// UIEdgeInsets insets = UIEdgeInsetsMake(top, left, top, left);
// UIImage *capImage = [image resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeTile];
//
}
/**
CGFloat top = 0; // 顶端盖高度
CGFloat bottom = 0 ; // 底端盖高度
CGFloat left = 0; // 左端盖宽度
CGFloat right = 0; // 右端盖宽度
// UIImageResizingModeStretch:拉伸形式,经过拉伸UIEdgeInsets指定的矩形区域来填充图片
// UIImageResizingModeTile:平铺形式,经过重复显现UIEdgeInsets指定的矩形区域来填充图片
@param img <#img description#>
@param top <#top description#>
@param left <#left description#>
@param bottom <#bottom description#>
@param right <#right description#>
@return <#return value description#>
*/
- (UIImage *) resizeImage:(UIImage *) img WithTop:(CGFloat) top WithLeft:(CGFloat) left WithBottom:(CGFloat) bottom WithRight:(CGFloat) right
{
UIImage * resizeImg = [img resizableImageWithCapInsets:UIEdgeInsetsMake(self.size.height * top, self.size.width * left, self.size.height * bottom, self.size.width * right) resizingMode:UIImageResizingModeStretch];
return resizeImg;
}
//返回一个可拉伸的图片
- (UIImage *)resizeWithImageName:(NSString *)name
{
UIImage *normal = [UIImage imageNamed:name];
// CGFloat w = normal.size.width * 0.5f ;
// CGFloat h = normal.size.height *0.5f ;
CGFloat w = normal.size.width*0.8;
CGFloat h = normal.size.height*0.8;
//传入上下左右不需要拉升的编剧,只拉伸中心部分
return [normal resizableImageWithCapInsets:UIEdgeInsetsMake(h, w, h, w)];
// [normal resizableImageWithCapInsets:UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)]
// 1 = width - leftCapWidth - right
// 1 = height - topCapHeight - bottom
//传入上下左右不需要拉升的编剧,只拉伸中心部分,而且传入形式(平铺/拉伸)
// [normal :<#(UIEdgeInsets)#> resizingMode:<#(UIImageResizingMode)#>]
//只用传入左边和顶部不需要拉伸的位置,系统会算出右边和底部不需要拉升的位置。而且中心有1X1的点用于拉伸或许平铺
// 1 = width - leftCapWidth - right
// 1 = height - topCapHeight - bottom
// return [normal stretchableImageWithLeftCapWidth:w topCapHeight:h];
}
@end
see also
只为你呈现有价值的信息,专注于移动端技术研究领域;更多服务和咨询请重视#公众号:iOS逆向
。