Apple官方的文档为生成一个UIImage对象提供了两种方法: imageNamed,其参数为图片的名字; [UIImage imageNamed:ImageName]; imageWithContentsOfFile 用imageNamed的方式加载时,会把图像数据根据它的名字缓存在系统内存中,以提高imageNamed方法获得相同图片的image对象的性能。
1、使用imageNamed函数: [UIImage imageNamed:@"ImageName"]; 2、使用NSData方式加载: NSString *filePath = [[NSBundle 但是利 用imageNamed加载图像也有自己的优势。对于同一个图像系统只会把它Cache到内存一次,这对于图像的重复利用是非常有优势的。 例如:你需要在 一个TableView里重复加载同样一个图标,那么用imageNamed加载图像,系统会把那个图标Cache到内存,在Table里每次利用那个图 像的时候,只会把图片指针指向同一块内存。 这种情况使用imageNamed加载图像就会变得非常有效。 利用NSData方式加载时,图像会被系统以数据方式加载到程序。 当图片数量多时,效率会比imageNamed低,加载速度明显变慢。 无论用哪种方式加载图像,图像使用结束后,一定要记得显示释放内存。
使用独立的窗口进行缓存是更有效率的选择(调用NSImage的setCachedSeparately:方法设置独立缓存), Load Named Image ok~铺垫了这么多之后,我们再来看一下最初的问题:当我们调用NSImage的imageNamed 使用imageNamed: 重复加载时,都会获得同一个图片对象: let img1 = NSImage(named: NSImage.Name.init("youwin"))!
这篇文章,要解决的是,使用一个自定义的 imageNamed 函数来替代系统的 imageNamed 函数.内部逻辑,将贯穿对比论证 关于"合适"的图片的定义.对iOS加载图片的规则不是很熟悉的童鞋,可以着重看这篇 NSLog(@"加载后的图片尺寸:%@",[NSValue valueWithCGSize:self.sampleImageView.image.size]); 封装为类目(category),实现自定义的 imageNamed 此处实现了一个简单够用的类目方法,支持从指定bundle读取指定名字的图片: #import "UIImage+imageNamed_bundle_.h" @implementation UIImage (imageNamed_bundle_) + (UIImage *)imageNamed:(NSString *)imgName bundle:(NSString *)bundleName { bundle:@"main"]; self.sampleImageView.image = image; 也支持有层级结构的图片资源的读取呦: UIImage * image = [UIImage imageNamed
initWithRootViewController:vcHome]; vcHome.title = @"首页"; vcHome.tabBarItem.image = [UIImage imageNamed initWithRootViewController:vcHome]; vcHome.title = @"首页"; vcHome.tabBarItem.image = [UIImage imageNamed @"tabbar_home"]; // 设置 tabbarItem 选中状态的图片(不被系统默认渲染,显示图像原始颜色) UIImage *imageHome = [UIImage imageNamed initWithRootViewController:vcHome]; vcHome.title = @"首页"; vcHome.tabBarItem.image = [UIImage imageNamed :image]; // 设置 tabbarItem 选中状态的图片(不被系统默认渲染,显示图像原始颜色) UIImage *imageHome = [UIImage imageNamed
log出了一个错误 CUICatalog:Invalid asset name supplied: (null), Google了一下在StackOverflow上各位大神说应该是[UIImage imageNamed 需要解决的问题是查找所有[UIImage imageNamed:]调用的时候, 找到name是nil的地方, 但是整个项目一搜 imageNamed 显示 267 results in 117 files 一开始想到的是用Method Swizzle来修改[UIImage imageNamed:]的实现, 在name为nil的时候用断言, 查看调用栈. 但是想想写了debug之后还得删掉, 比较麻烦. 右键选择Breakpoint选择 Edit Breakpoint , 在Symbol填入[UIImage imageNamed:] , 在Condition填入 [(NSString *)$arg3 length 打开Debug Navigator观察调用栈, 最顶部的一定是[UIImage imageNamed:], 点击调用栈下一条, 能够看到有调用到imageNamed的代码, 就是name为nil的地方.
UIImageView *myImage = [[UIImageView alloc] initWithFrame:myImageRect]; [myImage setImage:[UIImage imageNamed app.networkActivityIndicatorVisible = YES; 播放序列动画 NSArray *myImages = [NSArray arrayWithObjects: [UIImage imageNamed :@"myImage1.png"], [UIImage imageNamed:@"myImage2.png"], [UIImage imageNamed:@"myImage3.png "], [UIImage imageNamed:@"myImage4.gif"], nil]; UIImageView *myAnimatedView = [UIImageView
如果使用imageNamed这个方法加载一些比较大的资源文件就容易崩溃,从而引发了imageNamed生成的对象什么时候释放? 使用imageNamed这个方法生成的UIImage对象,会在应用的bundle中寻找图片,如果找到,则Cache到系统缓存中,作为内存的cache,而程序员是无法操作cache的,只能由系统自动处理, 由此看来[UIImage imageNamed:]只适合与UI界面中小的贴图的读取,而一些比较大的资源文件应该尽量避免使用这个接口[UIImage imageWithContentsOfFile]解决掉这个问题 for (int i = 0; i < 1000; i++) { UIImage* image = [UIImage imageNamed:@"some_image"]; // 对 image 为了解决这个问题,可以改成这样: for (int i = 0; i < 1000; i++) { @autoreleasepool { UIImage* image = [UIImage imageNamed
[_picV sd_setImageWithURL:[NSURL URLWithString:_topicModel.image1] placeholderImage:[UIImage imageNamed [_picV sd_setImageWithURL:[NSURL URLWithString:_topicModel.image1] placeholderImage:[UIImage imageNamed [_picV sd_setImageWithURL:[NSURL URLWithString:_topicModel.image0] placeholderImage:[UIImage imageNamed [_picV sd_setImageWithURL:[NSURL URLWithString:_topicModel.image0] placeholderImage:[UIImage imageNamed }else{ // 如果没有小图使用占位图 [_picV sd_setImageWithURL:nil placeholderImage:[UIImage imageNamed
BaseNavigationController *nav = [[BaseNavigationController alloc] init]; [nav.tabBarItem setImage:[[UIImage imageNamed imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]]; [nav.tabBarItem setSelectedImage:[[UIImage imageNamed imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]]; [nav.tabBarItem setImage:[[UIImage imageNamed UIBarButtonItemStyleDone target:self action:@selector(backIndex)]; [buttonItem setImage:[UIImage imageNamed UIButton *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [leftBtn setImage:[UIImage imageNamed
CGSizeMake(25, 25)] tag:0]; [itemHomePage setFinishedSelectedImage:[UIImage imageWithImage:[UIImage imageNamed jpg"] scaledToSize:CGSizeMake(25, 25)] withFinishedUnselectedImage:[UIImage imageWithImage:[UIImage imageNamed itemShoppingCart= [[UITabBarItem alloc] initWithTitle:@"我的购物车" image:[UIImage imageWithImage:[UIImage imageNamed jpg"] scaledToSize:CGSizeMake(25, 25)] withFinishedUnselectedImage:[UIImage imageWithImage:[UIImage imageNamed jpg"] scaledToSize:CGSizeMake(25, 25)] withFinishedUnselectedImage:[UIImage imageWithImage:[UIImage imageNamed
imageName = [NSString stringWithFormat:@"backImage%ld",(long)index]; //UIImage *image = [UIImage imageNamed 一种是: UIImage imageNamed:imageName 一种是: UIImage imageWithContentsOfFile:path 后面我再解释为什么需要对比这两种加载方式, 1>使用UIImage imageWithContentsOfFile:path image.png 2>使用UIImage imageNamed:imageName image.png 两种方式都实际滑动一分钟 , 可以清晰的看到,两种加载方式一开始都帧数很低,但是使用imageNamed: 的很快帧数就恢复到60帧,但是使用imageWithContentsOfFile:会一直卡顿,那是因为使用imageNamed 再来解释我们使用的两种加载方式,使用 imageWithContentsOfFile: 实际上是模拟网络下载图片到本地后,再从本地加载展示图片的过程,imageNamed:方式则是模拟从Assets.xcassets
[[UIImageView alloc] initWithFrame:CGRectMake(0, 170, windowWidth, 80)]; firstRow.image = [UIImage imageNamed UIImageView alloc] initWithFrame:CGRectMake(0, 170+80, windowWidth, 80)]; secondRow.image = [UIImage imageNamed UIImageView alloc] initWithFrame:CGRectMake(0, 170+160, windowWidth, 80)]; thirdRow.image = [UIImage imageNamed UIImageView alloc] initWithFrame:CGRectMake(0, 170+240, windowWidth, 80)]; fourthRow.image = [UIImage imageNamed UIImageView alloc] initWithFrame:CGRectMake(0, 170+320, windowWidth, 80)]; fifthRow.image = [UIImage imageNamed
recognize-1"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];; item0.image = [[UIImage imageNamed imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; item1.selectedImage = [[UIImage imageNamed @"life-1"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];; item1.image = [[UIImage imageNamed @"edit-1"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];; item2.image = [[UIImage imageNamed setting-1"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];; item3.image = [[UIImage imageNamed
实例下载: 最新源代码点击下载 用法简介: 通过创建菜单各个单元项来创建菜单: UIImage *storyMenuItemImage = [UIImage imageNamed:@"bg-menuitem.png "]; UIImage *storyMenuItemImagePressed = [UIImage imageNamed:@"bg-menuitem-highlighted.png"]; UIImage *starImage = [UIImage imageNamed:@"icon-star.png"]; AwesomeMenuItem *starMenuItem1 = [[AwesomeMenuItem AwesomeMenuItem *startItem = [[AwesomeMenuItem alloc] initWithImage:[UIImage imageNamed:@"bg-addbutton.png "] ContentImage:[UIImage imageNamed:@"icon-plus.png
UIButton *findBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [findBtn setImage:[UIImage imageNamed :@"icon_home_n"] forState:UIControlStateNormal]; [findBtn setImage:[UIImage imageNamed:@"icon_home_h UIButton *searchBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [searchBtn setImage:[UIImage imageNamed :@"icon_search_n"] forState:UIControlStateNormal]; [searchBtn setImage:[UIImage imageNamed:@"icon_search_h UIButton *costBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [costBtn setImage:[UIImage imageNamed
:@"更多分享" itemTitles:@[ @"新浪微博", @"腾讯微博", @"微信", @"朋友圈",@"QQ", @"QQ空间", @"我信朋友圈"] images:@[ [UIImage imageNamed [UIImage imageNamed [UIImage imageNamed [UIImage imageNamed [UIImage imageNamed
UIButtonTypeCustom)]; _sinaButton.frame = CGRectMake(30, 200, 15, 15); [_sinaButton setBackgroundImage:[UIImage imageNamed :@"invest_delecte"] forState:(UIControlStateNormal)]; [_sinaButton setBackgroundImage:[UIImage imageNamed sinaButton.bottom + 20, _sinaButton.width, _sinaButton.height); [_bankButton setBackgroundImage:[UIImage imageNamed :@"invest_delecte"] forState:(UIControlStateNormal)]; [_bankButton setBackgroundImage:[UIImage imageNamed
SCNPlane *plane =[SCNPlane planeWithWidth:2 height:2]; plane.firstMaterial.diffuse.contents = [UIImage imageNamed SCNPyramid pyramidWithWidth:1 height:1 length:1]; pyramid.firstMaterial.diffuse.contents = [UIImage imageNamed SCNSphere *sphere = [SCNSphere sphereWithRadius:1]; sphere.firstMaterial.diffuse.contents = [UIImage imageNamed [SCNCylinder cylinderWithRadius:1 height:2]; cylinder.firstMaterial.diffuse.contents = [UIImage imageNamed = [SCNTorus torusWithRingRadius:1 pipeRadius:0.5]; torus.firstMaterial.diffuse.contents = [UIImage imageNamed
customizeTabBarForController:(RDVTabBarController *)tabBarController { UIImage *finishedImage = [UIImage imageNamed :@"tabbar_selected_background"]; UIImage *unfinishedImage = [UIImage imageNamed:@"tabbar_normal_background setBackgroundSelectedImage:finishedImage withUnselectedImage:unfinishedImage]; UIImage *selectedimage = [UIImage imageNamed [tabBarItemImages objectAtIndex:index]]]; UIImage *unselectedimage = [UIImage imageNamed