苹果每发布一个系统,都够开发者忙活一阵的,更新xcode适配新系统:像iOS4支持Retina需要@2x的图;像iOS5不支持udid;像现在的iOS6和iPhone5要面对的下面的一堆问题。
这时候直接点Add就好了。会默认添加一张[email protected]的黑图:
不添加的话,程序运行起来会上下有黑边儿。
添加完以后的效果
这个地方再啰嗦两句:当透明第一次在群里说要添加这么一张图的时候,我的第一反应是:那不是程序启动的时候会有一张黑图么?而我的程序是不需要启动图的。而当自已添加这张图的时候才发现,这个担心是多余的。估计苹果自已做了什么优化,判断出来是黑图的时候就直接给跳过了。
在使用背景色的时候,我最喜欢用的一个系统自带的颜色就是:”Group Table View Background Color”。现在既然这个颜色消失了,换个别的颜色就好喽。
我们知道添加图片的时候,会直接添加到工具里,这时候如果有多个Target的时候,直接将[email protected]文件,拖拽到相应的”Copy Bundle Resources”里就好了。
再有要注意的就是多个Target在模拟器运行的时候,现在不像原来那么方便,直接切换配置文件就可以运行了。需要在测试不同Target表示的时候,除了切换配置文件还需要清空模拟器,不然不好使哟~
不被支持的硬件设备包括:iPod 2nd gen, iPhone 3G 或更老的iPhone
例如我打包时的错误提示就是:
1 2 |
warning: iOS deployment targets lower than 4.3 are not supported (current IPHONEOS_DEPLOYMENT_TARGET = "4.0", ARCHS = "armv7").
(null): iPhone/iPod Touch: application executable is missing a required architecture. At least one of the following architecture(s) must be present: armv6 (-19033) |
因为喜欢用Block,所以我开发的东东,一般最低都支持iOS4.0,看来是苹果逼着开发者和用户升级啊。
1 |
#define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
|
用时候直接
1 |
if
(iPhone5
) ooxx
|
就可以了。
另外,如果代码写界面的话,在iPhone5下View的高是568哟~
默认的话,如果你的界面上包含scrollview/TableView的话,这个界面基本上是不用改的,因为中间部分会自动拉伸。如果不包含这两个全屏的控件的话,怕是要自已再添加一个专门针对iPhone5的xib了。办法很简单,新建一个xib文件,将里面view的size设置成Retina 4 Full Screen就可以了。上面已经提到怎么判断iPhone5了,怎样读取不同的xib文件不用上代码了吧?
(iOS5的时候就出过一次状况,这次又来)
要深入理解这个问题,还需要您自已亲自做一些实验,iOS6取消了一个api,增加了两个api,但是这一去一加满足不了我的情况:应用在所有的界面都是竖屏,只在一个屏幕是横屏。就这一个情况要实现费了我半天的功夫。只说一下我最后怎么实现的。
首先:这横屏的xib里面的view就是横的
其次:屏幕适应只支持横屏
1 2 3 |
-
(
BOOL
)shouldAutorotateToInterfaceOrientation
:
(UIInterfaceOrientation
)interfaceOrientation
{
return UIInterfaceOrientationIsLandscape (interfaceOrientation ); } |
第三:在这个view是present出来的
第四:viewDidLoad里隐藏状态栏
1 2 3 4 5 6 |
-
(
void
)viewDidLoad
{
if (IOSSystemVersion > = 5.0 ) { //5.0及以后,不整这个,界面错位 整这个带动画的话,容易看到一个白头 [ [UIApplication sharedApplication ] setStatusBarHidden : YES ]; } } |
第五:viewWillAppear自已将view旋转90度
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-
(
void
)viewWillAppear
:
(
BOOL
)animated
{
[super viewWillAppear :animated ]; [UIView animateWithDuration :0.0f animations :^ { [self.view setTransform : CGAffineTransformMakeRotation (M_PI / 2 ) ]; if (iPhone5 ) { self.view.frame = CGRectMake ( 0, 0, 568, 320 ); } else { self.view.frame = CGRectMake ( 0, 0, 480, 320 ); } } ]; } |
如果工程里用到第三方库了,打包的时候还会提示下面的问题:
1 2 |
ld: file is universal (3 slices) but does not contain a(n) armv7s slice: /Users/rainbird/Desktop/myapp/iFileManager/iFileManager/ZBarSDK/libzbar.a for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation) |
上面的提示就是我使用的libzbar这个库不支持armv7s。
关于第三方库,如果是闭源的,像一些广告的SDK以及合作方提供的SDK就只能等了,人家啥时候更新啥时候算。像我遇到的ZBarSDK,这种第三方开源的SDK,就不要等了,还是自已动手丰衣足食吧。
首先关于闭源的库,一个临时的解决办法就是,先取消对armv7s的支持,这样就可以不用等第三方的库就开始测试了,办法是:在Xcode里,点击相应的Target,然后点Build Settings,找到VALID_ARCHS,然后删除里面的arvm7s,就可以了。
上面只是临时解决办法,说正事儿,以编译ZBar为例:
4.然后在lib上点右键去目录里找。
本来故事到这里应该就结束了,但是上面找到的那个文件,只能在真机用,模拟器用不了,怎么办呢?
进入到这个工具的Build目录,会看到下面这些目录
Debug-iphoneos/ Debug-iphonesimulator/ Release-iphoneos/ Release-iphonesimulator/
自已动手将模拟器的包和真机的包合并一下就好了。
1 2 3 |
[rainbird@localhost Products]$ pwd
/Users/rainbird/Library/Developer/Xcode/DerivedData/zbar-athgobfbdtwgftgcogpuwegpawlj/Build/Products [rainbird@localhost Products]$ lipo -create Release-iphoneos/libzbar.a Release-iphonesimulator/libzbar.a -o libzbar.a |
解释一下lipo合并两个库的命令:lipo -create第一个包 第二个包-o合并以后的包
这样的话,得到的libzbar.a就可以同时在模拟器和真机用了。这里有个小插曲,静态库编译一次,会生成所有的包,而我一上来就用的真机上的包,然后模拟器上用不了,又在真机的位置找了半天,以为生成不了模拟器的包,哎,思维定势了。
关于lipo还有一个常用的命令就是查看包的信息-info参数
1 2 |
[rainbird@localhost Products]$ lipo -info libzbar.a
Architectures in the fat file: libzbar.a are: armv7 (cputype (12) cpusubtype (11)) i386 |
转载请注明:dApps开发者 » 旧工程适配iOS 6和iPhone 5的一些故事