xib相关(二十一) —— UINib之图像、声音和视频资源(六)

版本记录

版本号 时间
V1.0 2018.05.07

前言

iOS中的视图加载可以有两种方式,一种是通过xib加载,另外一种就是通过纯代码加载。它们各有优点和好处,xib比较直观简单,代码比较灵活但是看着很多很乱,上一家公司主要风格就是用纯代码,这一家用的就是xib用的比较多。这几篇我们就详细的介绍一个xib相关知识。感兴趣的可以看上面写的几篇。
1. xib相关(一) —— 基本知识(一)
2. xib相关(二) —— 文件冲突问题(一)
3. xib相关(三) —— xib右侧标签介绍(一)
4. xib相关(四) —— 连线问题(一)
5. xib相关(五) —— 利用layout进行约束之界面(一)
6. xib相关(六) —— 利用layout进行约束之说明和注意事项(二)
7. xib相关(七) —— Storyboard中的segue (一)
8. xib相关(八) —— Size Classes(一)
9. xib相关(九) —— 几个IB修饰符(一)
10. xib相关(十) —— xib的国际化(一)
11. xib相关(十一) —— xib的高冷用法之修改视图的圆角半径、边框宽度和颜色(一)
12. xib相关(十二) —— UIStackView之基本介绍(一)
13. xib相关(十三) —— UIStackView之枚举UIStackViewDistribution使用(二)
14. xib相关(十四) —— UIStackView之UIStackViewAlignment使用(三)
15. xib相关(十五) —— UIStackView之工程实践(四)
16. xib相关(十六) —— UINib之基本介绍(一)
17. xib相关(十七) —— UINib之Introduction(二)
18. xib相关(十八) —— UINib之Nib文件(三)
19. xib相关(十九) —— UINib之Nib文件(四)
20. xib相关(二十) —— UINib之字符串资源(五)

回顾

上一篇主要讲述了UINib之字符串资源,这一篇讲述图像声音和视频资源。


Image, Sound, and Video Resources - 图像、声音和视频资源

OS X和iOS平台的构建旨在提供丰富的多媒体体验。 为了支持这种体验,这两个平台都为在应用程序中加载和使用图像,声音和视频资源提供了大量支持。 图像资源通常用于绘制应用程序用户界面的各个部分。 声音和视频资源使用较少,但也可以增强应用程序的基本外观和吸引力。 以下各节介绍了可用于在应用程序中使用图像,声音和视频资源的支持。


Images and Sounds in Nib Files - Nib文件中的图像和声音

使用Xcode,您可以从nib文件中引用应用程序的声音和图像文件。您可以这样做,将这些图像或声音与视图或控件的不同属性相关联。例如,您可以将默认图像设置为在图像视图中显示,或将图像设置为按钮进行显示。在nib文件中创建这样一个连接可以节省您在加载nib文件时必须稍后创建连接的麻烦。

要在nib文件中提供图像和声音资源,您只需将它们添加到Xcode项目中即可;然后Xcode在库窗格中列出它们。当你连接到一个给定的资源文件时,Xcode在nib文件中记录该连接。在加载时,nib加载代码在项目包中查找该资源,在构建时应该由Xcode放置该资源。

加载包含对图像和声音资源的引用的nib文件时,nib加载代码会尽可能缓存资源,以便以后轻松检索。例如,加载nib文件后,可以使用NSImage或UIImage的imageNamed:方法(取决于您的平台)检索与该nib文件关联的图像。在OS X中,您可以使用NSSoundsoundNamed:方法检索缓存的声音资源。


Loading Image Resources - 加载图像资源

图像资源通常用于大多数应用程序。 即使非常简单的应用程序也可以使用图像为控件和视图创建自定义外观。 OS X和iOS为使用Objective-C对象处理图像数据提供了广泛的支持。 这些对象使得使用图像非常容易,通常只需要几行代码来加载和绘制图像。 如果您不想使用Objective-C对象,则还可以使用Quartz使用基于C的界面加载图像。 以下各节介绍使用每种可用技术加载图像资源文件的过程。

1. Loading Images in Objective-C - 加载OC中的图像

要在Objective-C中加载图像,您可以使用NSImageUIImage对象,具体取决于当前平台。使用AppKit框架为OS X构建的应用程序使用NSImage对象加载图像并绘制它们。为iOS构建的应用程序使用UIImage对象。在功能上,这两个对象在加载现有图像资源时提供了几乎相同的行为。您通过将对象的指针传递给应用程序包中的图像文件来初始化对象,并且该图像对象负责加载图像数据的详细信息。

Listing 3-1显示了如何使用OS X中的NSImage类加载图像资源。找到图像资源(在本例中位于应用程序包中)后,只需使用该路径初始化图像对象即可。初始化后,可以使用NSImage的方法绘制图像,或将该对象传递给可以使用它的其他方法。要在iOS中执行完全相同的任务,您只需将NSImage的引用更改为UIImage。

Listing 3-1  Loading an image resource

NSString* imageName = [[NSBundle mainBundle] pathForResource:@"image1" ofType:@"png"];
NSImage* imageObj = [[NSImage alloc] initWithContentsOfFile:imageName];

您可以使用图像对象打开目标平台上支持的任何类型的图像。 每个对象通常是一个轻量级的包装器,用于更高级的图像处理代码。 要在当前图形上下文中绘制图像,您只需使用其中一种绘图相关方法即可。 NSImage和UIImage都有以几种不同的方式绘制图像的方法。 NSImage类还为操作加载的图像提供了额外的支持。

有关NSImage和UIImage类的方法的信息,请参阅NSImage Class ReferenceUIImage Class Reference。 有关NSImage类的其他功能的更多详细信息,请参阅Cocoa Drawing Guide中的Images

2. Loading Images Using Quartz - 使用Quartz加载图像

如果您正在编写基于C的代码,则可以使用Core FoundationQuartz调用的组合将图像资源加载到应用程序中。 Core Foundation为寻找图像资源并将相应的图像数据加载到内存中提供了初始支持。 Quartz将加载的图像数据存入内存,并将其转换为可用的CGImageRef,然后您的代码可用于绘制图像。

有两种使用Quartz加载图像的方法:数据提供者和图像源对象。数据提供程序在iOS和OS X中均可用。图像源对象仅在OS X v10.4及更高版本中可用,但可利用Image I / O框架来增强数据提供程序的基本图像处理功能。在加载和显示图像资源时,这两种技术都非常适合这项工作。唯一一次你可能比数据提供者更喜欢图像源的时候,是你想要更好地访问与图像相关的数据。

Listing 3-2显示了如何使用数据提供者来加载JPEG图像。此方法使用Core Foundation软件包支持来在应用程序的主包中找到映像并获取它的URL。然后它使用该URL创建数据提供者对象,然后为相应的JPEG数据创建CGImageRef。 (为简洁起见,这个例子省略了任何错误处理代码,你自己的代码应该确保任何引用的数据结构都是有效的。

Listing 3-2  Using data providers to load image resources

CGImageRef MyCreateJPEGImageRef (const char *imageName);
{
    CGImageRef image;
    CGDataProviderRef provider;
    CFStringRef name;
    CFURLRef url;
    CFBundleRef mainBundle = CFBundleGetMainBundle();
 
    // Get the URL to the bundle resource.
    name = CFStringCreateWithCString (NULL, imageName, kCFStringEncodingUTF8);
    url = CFBundleCopyResourceURL(mainBundle, name, CFSTR("jpg"), NULL);
    CFRelease(name);
 
    // Create the data provider object
    provider = CGDataProviderCreateWithURL (url);
    CFRelease (url);
 
    // Create the image object from that provider.
    image = CGImageCreateWithJPEGDataProvider (provider, NULL, true,
                                    kCGRenderingIntentDefault);
    CGDataProviderRelease (provider);
 
    return (image);
}

有关使用Quartz图像的详细信息,请参见Quartz 2D Programming Guide。 有关数据提供者的参考信息,请参阅Quartz 2D Reference Collection(OS X)Core Graphics Framework Reference(iOS)

3. Specifying High-Resolution Images in iOS - 指定iOS中高分辨率图像

iOS应用程序应该包含其图像资源的高分辨率版本。当应用程序在具有高分辨率屏幕的设备上运行时,高分辨率图像提供了额外的细节并且看起来更好,因为它们不需要缩放以适应空间。您可以为应用程序包中的每个图像资源提供高分辨率图像,包括图标和启动图像。

要指定图像的高分辨率版本,请创建一个版本,其宽度和高度(以像素为单位)是原始版本的两倍。您可以使用图像中的额外像素来提供更多细节。保存图像时,请使用相同的基本名称,但在基本文件名和文件扩展名之间包含字符串@ 2x。例如,如果您有名为MyImage.png的图像,则高分辨率版本的名称将为MyImage@2x.png。将图像的高分辨率和原始版本放在应用程序包中的相同位置。

当底层设备具有高分辨率屏幕时,bundle和图像加载例程会自动查找带有@ 2x字符串的图像文件。如果将@ 2x字符串与其他修饰符组合在一起,那么@ 2x字符串应位于任何设备修饰符之前,但位于所有其他修饰符之后,例如启动方向或URL scheme修饰符。例如:

  • MyImage.png - 图像资源的默认版本。
  • MyImage@2x.png - 具有Retina显示器的设备的图像资源的高分辨率版本。
  • MyImage〜iphone.png - 适用于iPhone和iPod touch的图像版本。
  • MyImage@2x~iphone.png - 具有Retina显示屏的iPhone和iPod touch设备的图像高分辨率版本。

当您想要加载图像时,请勿在代码中指定图像名称时包含@ 2x或任何设备修饰符。 例如,如果您的应用程序bundle包含上述列表中的图像文件,则会要求提供名为MyImage.png的图像。 系统会自动确定哪个版本的图像最适合并加载它。 同样,使用或绘制该图像时,您不必知道它是原始分辨率还是高分辨率版本。 图像绘制例程根据加载的图像自动调整。 但是,如果您仍然想知道图像是原始图像还是高分辨率版本,则可以检查其比例scale因子。 如果图像是高分辨率版本,则其比例因子设置为1.0以外的值。

有关如何支持高分辨率设备的更多信息,请参阅Supporting High-Resolution Screens In Views

后记

本篇主要讲述了图像、声音和视频资源,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容