1,修改状态栏的样式和隐藏。
首先,需要在Info.plist配置文件中,增加键:UIViewControllerBasedStatusBarAppearance,并设置为YES;
然后,在UIViewController子类中实现以下两个方法:
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } - (BOOL)prefersStatusBarHidden { return NO; } 最后,在需要刷新状态栏样式的时候,调用[self setNeedsStatusBarAppearanceUpdate]方法即可刷新 注意:
[self setNeedsStatusBarAppearanceUpdate]在push 或者 present 的controller里面调用才起作用。
2,UITableViewCell的定制。
以前可以直接继承UITableViewCell然后drawRect;
现在不行了,现在的UITableViewCell包含了一个scrollView,你重绘了UITableViewCell将会被这个scrollView遮住而完全没法显示.
解决思路:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell * cell = [[[UITableViewCellalloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:nil] autorelease];
UIView * subview = [[[XXView alloc] init] autorelease];
subview.userInteractionEnabled = NO;// 不设为NO会屏蔽cell的点击事件
subview.backgroundColor = [UIColorclearColor];// 设为透明从而使得cell.backgroundColor有效.
subview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[cell.contentView addSubview:subview];// cell.contentView是个readonly属性,所以别想着替换contentView了.
return cell;
}
3,用户界面设计中,新增了一个重要的概念:UIKit动力
默认支持如下5种动力行为:吸附行为(UIAttachmentBehavior),碰撞行为(UICollisionBehavior),重力行为(UIGravityBehavior),推动行为(UIPushBehavior),捕捉行为(UISnapBehavior;
4,将TextKit整合到所有基于文本的控件中(Text Kit可以对程序中的文本内容进行精致的排版)。
5,多任务
iOS7中,应用程序的后台执行模型,新增了如下两种类型:
1.fetch:
应用程序可以从网络中有规律的下载新数据;
注册方法为:在程序的Info.plist中,将UIBackgroundModes键值设置为fetch,然后在app delegate中,使用方法setMinimumBackgroundFetchInterval:来设置下载新数据操作之间的最小时间间隔。另外,必须在app delegate中实现application:performFetchWithCompletionHandler:方法以执行任意的下载。
2.remote-notifaction:
在iOS7中,通过推送通知,可以启动一个后台下载操作任务。
要使用这种模型,只需要将程序Info.plist文件中的UIBackgroundModes键值设置为remote-notification,然后在app delegate中实现application:didReceiveRemoteNotification:fetchCompletionHandler: 方法。
6,UIView类增加属性tintColor:可以使用一个tint color,并对view和它的subview有影响。
7,UIViewController增加: View controller之间的切换(transition)可以自定义、驱动式交互(driven interactively),或者完全根据自己指定的切换方式来替换。
8,UIView和UIScreen提供了一个新的方法:snapshot——返回一个view,可以用来显示程序的内容。
9,UIFontDescriptor对象使用一个属性字典来描述字体。通过font descriptor可以与其它平台相互交互。UIFont和UIFontDescriptor类支持动态调整字体大小。
10,UIApplicationDelegate协议新增了处理后台获取数据的操作。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0);
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0);
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler NS_AVAILABLE_IOS(7_0);
11,Table view支持对row或其他元素高度的评估(estimating),这样可以提升Table view的滚动性能。
12, Media Player Framework
在Media Player framework中,MPVolumeView类可以判断用户选择的无线路由(wireless route,例如AirPlay和Bluetooth)是否可用。你也可以判断无线路由当前是否可用。关于新接口信息,请参看framework的头文件。关于Media Player framework涉及到的类,请参看Media Player Framework Reference。
13, AV Foundation Framework
AVAudioSession支持一些新的行为:可以选择音频输入的首选项,包括来自内置麦克风的音频;支持多通道的输入和输出
// --------------
多任务的增强
iOS7中,应用程序的后台执行模型,新增了如下两种类型:
- fetch:如果应用程序需要从网络中有规律的下载新数据,那么现在可以通过向系统注册一下,使新数据的下载操作可以定期的被唤醒或者启动以在后台进行下载。注册方法为:在程序的Info.plist中,将UIBackgroundModes键值设置为fetch,然后在app delegate中,使用方法setMinimumBackgroundFetchInterval:来设置下载新数据操作之间的最小时间间隔。另外,必须在app delegate中实现application:performFetchWithCompletionHandler:方法以执行任意的下载。
- remote-notifaction:在iOS7之前,程序中使用的推送通知是用来给用户推送新的消息,而有新的消息到达时,如果需要获得消息相关更多内容时,还需要用户启动相应的程序,以在程序中获取新的消息内容,而现在在iOS7中,通过推送通知,可以启动一个后台下载操作任务。要使用这种模型,只需要将程序Info.plist文件中的UIBackgroundModes键值设置为remote-notification,然后在app delegate中实现application:didReceiveRemoteNotification:fetchCompletionHandler: 方法。
无论是fetch或remote-notification后台执行模型,在适当的时机,都有可能被启动或者从休眠(suspended)状态转移到后台状态。就拿fetch后台模型来说,系统会根据当前可用的信息来来决定启动或者唤醒程序的最佳时机。例如,当网络条件不错,或者设备已经被唤醒的时候,会启动或唤醒程序以执行程序的fetch后台操作。再来看看remote-notification后台执行模型——当有一条新的推送通知到达设备时(在通知用户之前),程序可以先去下载新的消息内容,当内容都准备好之后,就可以通知用户了——可见,对于remote-notification后台执行模型,可以让用户把注意力都集中在内容上,这也符合本文开头提到的iOS7设计重心。
在程序中,处理后台下载数据时,应用使用NSURLSession类。这个类对已有的NSURLConnection类进行了改进——针对初始化和处理NSURLRequest对象,提供了一个简单的、基于任务的接口。单个NSURLSession对象可以初始化多个下载和上传任务,并且通过它的delegate,可以处理来此服务器的任意身份认证请求。
关于多任务的更多内容,在随后的博文中,笔者会进行详细的介绍,读者也可以查阅iOS App Programming Guide中的“App States and Multitasking”。
游戏
在iOS7中,苹果加强了对游戏开发的支持。这主要体现在如下三个方面:
- Sprite Kit Framework
Sprite Kit Framework (SpriteKit.framework)提供了一个优化了的硬件加速动画系统——用于创建2D和2.5D游戏。包括了游戏开发中许多重要的基本内容:图形渲染、动画系统、声音播放,并还有一个物理模拟引擎。通过Sprite Kit Framework可以让开发者把工作重点放在游戏内容的设计和交互上。
Sprite Kit Framework中,内容是以场景(scenes)的形式组织的。一个场景可以包括:纹理对象、视频、基于路径的形状、图片滤镜以及其它有些特殊的效果。Sprite Kit以最有效的方式来决定这些对象在屏幕上的渲染。当需要在场景中对某个对象进行动画时,可以使用Sprite Kit来明确的指定一个动作,或者使用物理模拟引擎给某个对象定义一个物理行为(例如重力、吸附和排斥)。
除了Sprite Kit Framework,苹果还提供了Xcode工具来创建粒子发射效果和纹理集合。通过Xcode工具可以管理程序的assets,以及快速的更新Sprite Kit场景。
更多关于如何使用Sprite Kit,读者可以参考Sprite Kit Programming Guide。苹果也提供了一个示例演示如何使用Sprite Kit:Explained Adventure(From Apple)。
- Game Controller Framework
Game Controller Framework (GameController.framework)可以让你在程序中发现并对游戏控制器硬件进行配置。通过Game Controller Framework可以让iOS设备通过无线或者蓝牙进行连接。当控制器可用的时候,该Framework会通知你的程序。
更多相关信息可以参考Game Controller Programming Guide。
- Game Center 改进
在iOS7中,苹果对游戏中心(Game Center)做了如下改进:
- 给玩家提供一个与其它玩家互动的机会,即使目前还没有轮到该玩家。通过该功能,可以实现玩家之间的聊天、交易等(即使没有轮到玩家)。
- 每个程序的排行榜限制已经从原来的25变为100.通过GKLeaderboardSet对象,可以对你的排行榜进行组织,并把上限增加只500。
- 在游戏中进行挑战(做任务)的时候,可以为这个挑战添加条件限制。例如,在驾驶游戏中,指定必须使用相同的车辆。
- 为了防止作弊,增加了认证的支持,以及其它有些功能。
更多关于如何使用新的Game Center功能,请参考Game Center Programming Guide 。
关于Game Kit Framework,请参考Game Kit Framework。
地图
基于地图信息,苹果对Map Kit framework (MapKit.framework)做了大量的改进,并新增了不少功能。使用地图来显示的位置信息现在可以利用3D地图了,可以通过编程的方式来控制地图的视角。Map Kit还做了其它一些重要的改变:
- 图层(Overlay)可以被放置在地图中不同的层中,这样就可以将图层放置在相关数据的上面或者下面。
- 可以使用MKMapCamera对象在地图中增加一个位置、倾斜和航向信息。摄像头信息可以给地图增加3D视图体验。
- 通过MKDirection类可以从苹果那里请求获得方向相关的线路信息。通过获得的线路信息可以创建一个图层并显示到地图中。
- MKGeodesicPolyline类可以参照地球的曲率,创建一个基于线条的图层。
- 使用MKMapSnapshotter类可以捕捉基于地图的图片。
- 目前可视化的图层是基于MKOverlayRenderer的,这取代了之前的图层视图,并提供了一个简单的渲染方法。
- 可以使用MKTileOverlay和MKTileOverlayRenderer类来取代地图上已有的大头针(tile)。
更多相关信息,请阅读Map Kit Framework Reference 。
AirDrop
通过AirDrop,用户可以给附近的iOS设备分享图片、文档、URL以及其它有些数据。AirDrop支持内置到已有的UIActivityViewController中——这个类会根据分享的不同数据显示出不同的选项。数据的话,可以通过实现UIActivityItemSource接口后进行发送。大概苹果也不愿意看到超出他们控制的文件分享功能吧,毕竟这和iOS设计的初衷不一样。如果你不使用UIActivityViewController的话,可能是无法在应用里实装AirDrop功能了。苹果建议:如果你的程序中还没有使用这个类,请考虑将其添加到程序中。
更多关于利用activity view controller来访分享数据的信息,请参考UIActivityViewController Class Reference。
程序间的音频(inter-App Audio)
Audio Unit framework (AudioUnit.framework)现在支持程序间的音频了——可以在同一台设备上不同的两个程序之间发送MIDI命令和音频流。例如,通过该功能,你可以使用一个程序来录制音乐,然后将录制的音乐音乐发送到另外一个能对音乐进行处理的程序中。
为了公开(vend)你程序中的音频数据,需要发布一个AURemoteIO实例来充当音频组件——对其它进程是可见的。在iOS7里面,要在另外一个程序中使用程序间的音频功能,请使用音频组件发现接口。
更多相关内容请看:Audio Toolbox Framework Reference
点对点的连接
通过Multipeer Connectivity framework (MultipeerConnectivity.framework)可以查找附近的设备,并直接与这些设备进行通讯——不需要通过互联网。该Framework具有这样的特点:很容易的创建多点(multipeer)会话、支持稳定、可靠和实时的数据传输。可以看出,通过该Framework,你的程序可以与附近的设备进行通讯,并做到数据的无缝交换。
该Framework提供了两种方式来查找并管理网络服务:编程方式和基于UI选项。可以使用MCNearbyServiceBrowser类以编程的方式查找并管理设备。另外,我们可以将MCPeerPickerViewController集成到程序中——用来显示用户可以选择的设备列表。
更多相关信息,请阅读:Multipeer Connectivity Framework Reference
新增的Framework
在iOS7中,新增了如下一些Framework:
- Game Controller framework(GameController.framework):提供了与游戏相关的硬件通讯接口。
- Sprite Kit framework(SpriteKit.framework):提供了基于精灵(sprite-based)的动画和图形渲染。
- Multipeer Connectivity framework(MultipeerConnectivity.framework):提供设备间点对点通讯的功能。
- JavaScript Core framework (JavaScriptCore.framework):提供了用Objective-C封装的大量标准JavaScript对象。通过该framework可以对JavaScript代码进行评估(evaluate),以及解析JSON。
- Media Accessibility framework (MediaAccessibility.framework):管理媒体文件中字幕(closed-caption)内容的显示。通过该Framework与settings的结合,可以让用户开启字幕的显示。
- Safari Services framework (SafariServices.framework):通过该framework,可以通过编程的方式将URL添加到用户的Safari阅读列表中。
小结下,iOS7有好多好玩的东西的:动态的UIkit可以实现更多炫丽的UI;Text Kit可以更加方便文字的编排,不用再用CoreText等去处理一大堆细节;后台多任务的增强2种方式,更多选择;AirDrop提供数据分享的新方式;Peer-to-Peer Connectivity则提供更灵活的数据分享;另外还有地图、音频等的改变;而对于游戏开发者,这次iOS7提供全新的游戏框架,有了自己的精灵系统,会有很大的发挥空间。
另外OC支持了Module:
“The Objective-C programming language has been enhanced to support modules, resulting in faster builds and shorter project indexing times. Module support is enabled in all new projects created using Xcode 5. If you have existing projects, you must enable this support explicitly by modifying your project’s Enable Modules setting.”