`
啸笑天
  • 浏览: 3462456 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

兼容sdk7&iOS7的issue解决小片段总结

阅读更多

 

大笑ios7新增加的icon尺寸:

76 x 76:Size for iPad 2 and iPad mini (standard resolution)

120 x 120 :Size for iPhone  and iPod touch (high resolution)

152 x 152: Size for iPad and iPad mini (high resolution)

参考:

http://blog.manbolo.com/2013/08/15/new-metrics-for-ios-7-app-icons

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/mobilehig/IconMatrix.html

 

大笑Launch image

原来做ios5,6的启动画面时,如果有status bar,我们会考虑做一张高度少20point的图片,现在ios7的status bar透明了,所以Launch image需要做成全屏尺寸。

 

大笑在xcode5中同时预览ios7和ios7以前的ui样式:

1、打开需要预览的xib;

2、打开assistant editor;

3、点击Manual选择Pre view


 
 

 

大笑 

判断ios7:

#define NLSystemVersionGreaterOrEqualThan(version) ([[[UIDevice currentDevice] systemVersion] floatValue] >= version)
#define IOS7_OR_LATER NLSystemVersionGreaterOrEqualThan(7.0)

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
        if (IOS7_OR_LATER) {
           //适配7的代码,这里是在sdk7,ios7中代码
        }
#endif
//xcode4.6  支持run ios7

ps:一个不错的宏:

#ifndef kCFCoreFoundationVersionNumber_iOS_6_1
#define kCFCoreFoundationVersionNumber_iOS_6_1 793.00
#endif

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
#define IF_IOS7_OR_GREATER(...) \
if (kCFCoreFoundationVersionNumber > kCFCoreFoundationVersionNumber_iOS_6_1) \
{ \
__VA_ARGS__ \
}
#else
#define IF_IOS7_OR_GREATER(...) 
#endif

 

判断SDK7:

 

//前提至少运行在xcode4.6有sdk6.1     
  #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
       //..........
       #endif

 判断运行时方法:

 

- (BOOL)respondsToSelector:(SEL)aSelector;

例如:

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
{
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

 

 大笑ios7中UITableView的cell separator默认不是从最左边开始

下面兼容低于ios7的版本:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
        if (IOS7_OR_LATER) {
            [tabelView setSeparatorInset:UIEdgeInsetsZero];//
        }
#endif

 

大笑我这是自定义的xib的cell:本来是透明的uitableview背景,到ios7变成白色(因为背景是白色):

增加:
 cell.backgroundColor = [UIColor clearColor];//我是由于这层挡住了,大家注意下每一层颜色

在之前的版本中UITableViewCell的backgroundColor是透明背景的,但是在iOS7中是默认白色背景,如果在TableView后面加入背景的应用要注意了,在创建UITableViewCell的时候把backgroundColor设置为[UIColor clearColor]

 

大笑UILabel不一致的background

对于UILabel,在iOS 7中它的background颜色默认是clearColor,而在iOS 6中默认的是白色。所以,我们最好在代码中对label的background颜色进行明确的设置:

view.backgroundColor = [UIColor clearColor];

 

大笑我这是自定义的xib的cell:用xib自定义的cell上的按钮不能响应点击事件,一种是把按钮放到cell的contentView上,或者是设置[cell.contentView setUserInteractionEnabled: NO];来屏蔽cell上的点击事件

 

大笑

如果你最近在做对iOS7的兼容时,发现你的table view cell显示不正常。这很可能是你以前的用法不对。Table view cell的自定义内容应该作为 cell.contentView的子view添加到cell中,如果你直接用 [cell addSubView:]方法而不是[cell.contentView addSubView:]方法添加子元素,那么就可能在iOS7下出来异常的表现。主要原因是iOS7的Table view cell内部实现有了部分变化。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

UITableViewCell * cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:@"cellIdentifier"];

UIView * subview = [[XXView alloc] init];

subview.userInteractionEnabled = NO;// 不设为NO会屏蔽cell的点击事件

subview.backgroundColor = [UIColor clearColor];// 设为透明从而使得cell.backgroundColor有效.

subview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

[cell.contentView addSubview:subview];// cell.contentView是个readonly属性,所以别想着替换contentView了.

return cell;

}

 

 

大笑在ios5,ios6中正常执行的动画,但到ios7中不定时的会消失。

解决方案:在可能消失的地方加上“[UIView setAnimationsEnabled:YES]”,比如action方法,viewWillappear方法等。

网上暂时还没有与这个有关的问题,与这个类似:http://stackoverflow.com/questions/18880584/ios-7-animation-block-not-being-called

 

大笑

视图控制器接口wantsFullScreenLayout已作废。如果你像以前那样地指定wantsFullScreenLayout = NO,iOS 7中视图控制器会在将其内容显示到一个意外的屏幕位置。

 

大笑NSString 绘制

ios7 下使用

- (void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary *)attrs

进行绘制,需要定义attributes,对样式进行定义。

例如attributes是@{NSFontAttributeName:[UIFontsystemFontOfSize:8], NSStrokeColorAttributeName:[[UIColorgreenColor] colorWithAlphaComponent:0.5]},但这个属性会影响上下文。

ios7 之前使用 

- (CGSize)drawAtPoint:(CGPoint)point withFont:(UIFont *)font  绘制。

 

大笑navigation controller容器中布局到ios7中往上偏移了64px

iOS6中默认的布局将从navigation bar的底部开始,但到了iOS7中默认布局从navigation bar的顶部开始,这就是为什么所有的UI元素都往上漂移了。因为在iOS7中,苹果引入了一个新的属性,叫做[UIViewController setEdgesForExtendedLayout:],它的默认值为UIRectEdgeAll,使用edgesForExtendedLayout指定视图的哪条边需要扩展,不用理会操作栏的透明度。所以这种情况快速修复的方法是:在-(void)viewDidLoad中添加如下一行代码:

self.edgesForExtendedLayout = UIRectEdgeNone;

 

大笑extendedLayoutIncludesOpaqueBars

关于这个属性的测试版本中默认值是YES,正式版本是NO!

如果你使用了不透明的navigation bar,设置edgesForExtendedLayout 还是默认值UIRectEdgeAll,你又想整个view全屏(navigation bar下面的内容网上漂移64px) extendedLayoutIncludesOpaqueBars 的值设置为YES。

例如:

在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中给uinavigationbar设置背景图片使之不透明:
    CGSize imageSize = CGSizeMake(1, 1);
    UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0);
    [[UIColor greenColor] set];
    UIBezierPath * path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
    [path fill];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext ();
    UIGraphicsEndImageContext();
    
    [[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];

 然后在需要全屏的UIViewController中设置:

self.extendedLayoutIncludesOpaqueBars = YES;

 

大笑隐藏状态条

原来在ios6中是:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    return YES;
}

 现在在ios7中无效了。

 

快速解决:

在项目plist文件中修改为:

View controller-based status bar appearance 的值为NO。

 

但是我认为这个快速解决是没有按照苹果的思路来解决的,而且会有些问题,比如,当你在某个界面隐藏了status bar,退回到上一个界面时,status bar仍然是隐藏的。 首先,苹果把View controller-based status bar appearance默认的值设为YES,是有他的道理的,新系统下,苹果希望我们的viewcontroller去控制status bar,也就是说,我们大多数的界面应该是统一的,偶尔一些viewcontroller需要status bar特殊控制的,完全交给当前的viewcontroller来做。那么推荐解决方案:

保持View controller-based status bar appearance 的默认值为YES,然后在ViewController中重写prefersStatusBarHidden方法:

 

- (BOOL)prefersStatusBarHidden
{
    return YES;
}
大笑
升级到ios7 ,默认状态栏是透明的,就是状态栏只有文字没有背景。现在的情况是,默认是会叠合的,开发需要从20px像素以下开始布局页面元素才能避免。


 

大笑 状态栏样式修改:

在在UIViewController或子类中实现以下两个方法:

- (BOOL)prefersStatusBarHidden
{
    return YES;
}
- (UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleLightContent;
}

 在需要刷新状态栏样式的时候,调用

- (void)setNeedsStatusBarAppearanceUpdate 


 

 

 大笑在iOS7 UINavigationController中侧滑手势返回

假如你自定义leftBarButtonItem,返回手势会失效,需要实现:

  self.navigationController.interactivePopGestureRecognizer.delegate = self;

 假如你没有自定义leftBarButtonItem或其他需求而不需要手势,必须实现:

 

self.navigationController.interactivePopGestureRecognizer.enabled = NO;

 

 大笑

在iOS 6 中,tintColor 可以用来给导航栏的背景着色、tab 栏、工具栏、搜索栏、搜索栏的 范围选择栏着色。而在iOS 7 中,给背景着色只需要使用barTintColor 属性就可以了,所以iOS7中barTintColor 取代原有的 tintColor, 原有的tintColor只修改对应bar上的按钮颜色。

 

大笑Navigation Bar



 

也就是说如果设置Navigation Bar的图片,并且这个图片高度保持在44point(88px),那么IOS5,6,7的效果是一致的。 

参考:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/Bars.html#//apple_ref/doc/uid/TP40013174-CH8-SW1

 

大笑 UIBarButtonItem

在iOS7中自定义的 UIBarButtonItem 所有的item向中间偏移了,如果需要适配ios6的风格需要修改

简单处理:

 

UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
                                       initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                  target:nil action:nil];
negativeSpacer.width = -16;// it was -6 in iOS 6
[self.navigationItem setLeftBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, requriedButton/*this will be the button which u actually need*/, nil] animated:NO];
 如果想不修改源代码,例如setLeftBarButtonItem等方法,可以在category中覆盖:
#import "UINavigationItem+PtHelper.h"

@implementation UINavigationItem (PtHelper)

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
- (void)setLeftBarButtonItem:(UIBarButtonItem *)_leftBarButtonItem
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
    {
        UIBarButtonItem *negativeSeperator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
        negativeSeperator.width = -16;
        
        if (_leftBarButtonItem)
        {
            [self setLeftBarButtonItems:@[negativeSeperator, _leftBarButtonItem]];
        }
        else
        {
            [self setLeftBarButtonItems:@[negativeSeperator]];
        }
        [negativeSeperator release];
    }
    else
    {
        [self setLeftBarButtonItem:_leftBarButtonItem animated:NO];
    }
}

- (void)setRightBarButtonItem:(UIBarButtonItem *)_rightBarButtonItem
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
    {
        UIBarButtonItem *negativeSeperator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
        negativeSeperator.width = -10;
        
        if (_rightBarButtonItem)
        {
            [self setRightBarButtonItems:@[negativeSeperator, _rightBarButtonItem]];
        }
        else
        {
            [self setRightBarButtonItems:@[negativeSeperator]];
        }
        [negativeSeperator release];
    }
    else
    {
        [self setRightBarButtonItem:_rightBarButtonItem animated:NO];
    }
}

#endif
 
@end
 

 大笑

 

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode  在ios7中过期

 

在ios7中使用:

 

- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context

例如:

 CGSize size = CGSizeMake(screenSize.width - self.horizontalMargin * 4.f, 1000.f);
        if(IOS7_OR_LATER){
            CGRect textRect = [text boundingRectWithSize:size options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName:font} context:nil];
            self.contentWidth = self.contentWidth!=0.f?self.contentWidth:textRect.size.width;
            self.contentHeight = self.contentHeight!=0.f?self.contentHeight:textRect.size.height;
        }else{
            CGSize  textSize = [text sizeWithFont:font constrainedToSize:size lineBreakMode:UILineBreakModeWordWrap];
            self.contentWidth = self.contentWidth!=0.f?self.contentWidth:textSize.width;
            self.contentHeight = self.contentHeight!=0.f?self.contentHeight:textSize.height;
        }

 https://developer.apple.com/library/ios/documentation/UIKit/Reference/NSString_UIKit_Additions/Reference/Reference.html#//apple_ref/occ/instm/NSString/boundingRectWithSize:options:attributes:context:

 

 大笑

 ios7新增的属性sectionIndexBackgroundColor,在索引没有被触摸时默认是白色。

    if (IS_IOS_7) {
        self.playersTableView.sectionIndexBackgroundColor = [UIColor clearColor];
//        self.playersTableView.sectionIndexTrackingBackgroundColor = [UIColor clearColor];
    }

 

大笑在ios7 ipad中tabbar高度不是49

In iOS 7, a tab bar on iPad has a height of 56 points.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 19.8 KB
  • 大小: 166 KB
  • 大小: 44.3 KB
  • 大小: 45.9 KB
  • 大小: 131 KB
  • 大小: 152.2 KB
分享到:
评论
1 楼 啸笑天 2013-11-19  
1
#ifndef kCFCoreFoundationVersionNumber_iOS_6_1
#define kCFCoreFoundationVersionNumber_iOS_6_1 793.00
#endif

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
#define IF_IOS7_OR_GREATER(...) \
if (kCFCoreFoundationVersionNumber > kCFCoreFoundationVersionNumber_iOS_6_1) \
{ \
__VA_ARGS__ \
}
#else
#define IF_IOS7_OR_GREATER(...)
#endif

相关推荐

    Delphi调用iOS三方SDK教程&微信接口示例&工具

    本教程主要关注如何使用Delphi这一强大的集成开发环境(IDE)来调用iOS的三方SDK,并且结合微信接口进行应用扩展。Delphi,以其强大的Object Pascal语法和VCL/FMX框架,使得开发者能够轻松地创建桌面和移动应用程序...

    IOS11SDK xcode8调试IOS11

    xcode8调试IOS11 Shift+Command+G进入 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 把解压后的文件复制进去。

    微软语音识别开发包 Speech SDK 5.1 & 中文语音包

    包含: 1、Speech SDK 5.1 2、Speech SDK 5.1 中文语言包 3、先安装Speech SDK5.1 再安装Speech SDK5.1 中文语言包。完成安装后,安装路径下有使用例子

    vuforia-sdk-ios-7-1-31

    2. **iOS兼容性**:vuforia-sdk-ios-7-1-31明确指出它适用于iOS 7.1版本及以上,这意味着开发者可以利用这个SDK为运行iOS 7.1及更高版本的iPhone和iPad创建AR应用。然而,随着新版本的iOS系统不断更新,开发者需要...

    海康威视ios版SDK

    这个版本的SDK兼容2016年的iOS系统版本,但需要注意的是,随着iOS系统的更新,可能需要更新SDK以保持兼容性,避免出现运行问题。 9. **开发文档** "开发文档"标签表明SDK提供了一份详细的文档,指导开发者如何...

    ios sdk 13.4.zip

    最新的ios13.4的sdk包,解压后的文件夹放在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

    iOS9.3.2,iOS10(Xcode_8_beta6)SDK支持xocde5、6

    本资源集中的标题和描述提到了iOS9.3.2和iOS10的SDK,以及它们与Xcode 5、6的兼容性,这对于那些希望在旧版本Xcode上开发或调试新版本iOS应用的开发者来说非常有价值。 首先,iOS9.3.2 SDK是Apple为开发针对iOS...

    xcode IOS sdk(ios11及以上)

    xcode ios sdk 只收辛苦积分,有情发放,IOS11.3、11.3 (15E217)、11.3 (15E5178d)、11.3 (15E5201e)、11.4、11.4 (15F79)、11.4 (15F5037c)、11.4 (15F5061c)、12.0 (16A5288q)

    IOS端VIN码识别开发包sdk

    在操作系统支持方面,该SDK明确表示兼容iOS 7.0及更高版本。这意味着开发应用时,至少需要考虑从iOS 7开始的向下兼容性。随着iOS系统的不断更新,开发者还需要关注新版本可能带来的API变化,确保SDK在不同版本上的...

    Xcode 13,iOS15SDK资源下载

    不想更新Xcode的,还想在Xcode 上运行的可以将SDK移入指定路径/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

    IOS 模拟器9.3sdk

    7. **兼容性测试**:通过模拟器,开发者可以确保他们的应用在不同屏幕尺寸、分辨率和系统版本的设备上都能正常运行,对于iOS 9.3 SDK来说,这意味着测试应用在9.3版本的兼容性。 8. **性能优化**:模拟器可以帮助...

    穿山甲ios集成SDK

    3. **适配iOS版本**:确保SDK与应用支持的最低iOS版本兼容,避免因系统版本差异导致的问题。 4. **更新策略**:随着SDK版本的更新,及时跟进并升级,以获取最新的功能和修复。 总的来说,穿山甲iOS集成SDK是开发者...

    Xcode iOS 10.1 SDK 下载

    总结来说,Xcode iOS 10.1 SDK是开发者构建针对iOS 10.1及其以上版本应用的必备工具,它提供了一系列的工具和框架,以支持创新的增强现实应用、智能功能以及更丰富的用户体验。通过充分利用这些资源,开发者可以为...

    XE6\XE7移动开发环境搭建之IOS篇

    XE6移动开发环境搭建之IOS篇(9):配置XE6的IOS SDK(有图有真相) 165 XE6 & IOS开发之免证书真机调试(1):颁发属于自己的App签名证书(有图有真相) 198 XE6 & IOS开发之免证书真机调试(2):连接真机并运行...

    iOS 开发 SDK 思维导图 (iOS Technology Overview)

    在iOS开发中,SDK(Software Development Kit)是开发者构建应用程序的核心工具集,它包含了各种库、框架、编译器和调试工具。"iOS 开发 SDK 思维导图 (iOS Technology Overview)" 提供了一个全面的视角来理解iOS ...

    Beginning iOS 7 Development Exploring the iOS SDK随书源代码

    《 Beginning iOS 7 Development Exploring the iOS SDK》是一本针对初学者的专业书籍,旨在帮助读者深入探索iOS 7的应用程序开发。这本书详细介绍了如何利用Apple的iOS Software Development Kit (SDK)来构建高质量...

    IOS 12.2 SDK包

    **iOS 12.2 SDK包详解** iOS 12.2是苹果公司为iOS操作系统发布的一个重要更新,主要针对开发者提供了丰富的SDK(Software Development Kit,软件开发工具包)资源,便于他们创建、测试和优化应用程序。这个SDK包是...

    大华乐橙摄像头IOS通用SDK

    这款SDK适用于各种基于iOS系统的设备,包括iPhone、iPad等,且兼容性良好,能够覆盖多种型号的大华摄像头产品。 该SDK包含了丰富的功能模块,如视频流处理、音频处理、设备控制、云服务接口等,旨在帮助开发者快速...

Global site tag (gtag.js) - Google Analytics