IOS开发 IOS9.0上遇到的一些新问题

关于IOS9.0遇到的一些问题

关于IOS9.0 需要配置白名单适配啥的,这里有个链接,写的很详细,可以参考下:https://github.com/ChenYilong/iOS9AdaptationTips

IOS 技术交流群:77081333

接下来就说在 真机在IOS9 上遇到的一些问题:

1,多语言问题

由于 手上做的app 是国际化的app,因此做了多语言,使用了系统的NSlocalizedString。多语言做了法语,西班牙, 葡萄牙 三种语言,但是有些用户反馈:当手机切换到非这三种语言的时候,本该显示英文的,却显示了中文(出现这种问题,应该是 IOS多语言备选规则问题)。所以决定自己写个方法去加载多语言包
if ([SYSTEM_LANG isEqualToString:@"fr-CA"] || [SYSTEM_LANG isEqualToString:@"fr"])  // 法国 及 地区 语言
    {
        NSString *pathString = [[NSBundle mainBundle] pathForResource:@"fr" ofType:@"lproj"];
        NSBundle *enLanguageBundle = [NSBundle bundleWithPath:pathString];
        valueString = [enLanguageBundle localizedStringForKey:keyString value:nil table:nil];
    }
    else if ([SYSTEM_LANG isEqualToString:@"es-MX"] || [SYSTEM_LANG isEqualToString:@"es"]) // 西班牙 及 地区 语言
    {
        NSString *pathString = [[NSBundle mainBundle] pathForResource:@"es" ofType:@"lproj"];
        NSBundle *enLanguageBundle = [NSBundle bundleWithPath:pathString];
        valueString = [enLanguageBundle localizedStringForKey:keyString value:nil table:nil];
    }
    else if ([SYSTEM_LANG isEqualToString:@"pt"] || [SYSTEM_LANG isEqualToString:@"pt-PT"] )
    {
        NSString *pathString = [[NSBundle mainBundle] pathForResource:@"pt" ofType:@"lproj"];
        NSBundle *enLanguageBundle = [NSBundle bundleWithPath:pathString];
        valueString = [enLanguageBundle localizedStringForKey:keyString value:nil table:nil];
    }
以上代码我用的是   isEqualToString 方法,但是  [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] objectAtIndex:0]   这个方法在IOS9返回的字符串 多了“-CH”,导致判断不成功,法语语言系统下显示的不是法语,而是英语。只需要把 isEqualToString 方法 改为   hasPrefix (只判断前缀) 即可解决。

2,UIPickerView 问题

在IOS6,IOS7,IOS8  写过 UIpickerView的都知道,这个控件的高度是不需要自己设置的,你可以把高度设置为0照样可以显示,当你获取这个控件高度的时候,返回的不是0,而是该控件的真实高度。但是在IOS9.0,你设置的是0,获取改控件高度的时候 给你返回的也是0,IOS9.0 该控件给你返回的是你设置的高度,有兴趣的童鞋可以去尝试下。
UIView *coverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_SIZE.width, SCREEN_SIZE.height)];
                    coverView.tag = COVER_VIEW_TAG;
                    coverView.backgroundColor = RGBACOLOR(0, 0, 0, 1);
                    coverView.alpha = 0;
                    
                    UIButton *cancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
                    cancelBtn.tag = CANCEL_BTN_TAG;
                    cancelBtn.frame = CGRectMake(0, 0, 60, 44);
                    [cancelBtn setTitle:[StaticMethods getLanTextStrByKey:@"CANCEL"] forState:UIControlStateNormal];
                    cancelBtn.titleLabel.adjustsFontSizeToFitWidth = YES;
                    [cancelBtn setTitleColor:RGBACOLOR(0, 122, 255, 1) forState:UIControlStateNormal];
                    [cancelBtn addTarget:self action:@selector(timeAction:) forControlEvents:UIControlEventTouchUpInside];
                    
                    UIButton *comfirmBtn = [UIButton buttonWithType:UIButtonTypeCustom];
                    comfirmBtn.tag = COMFIRM_BTN_TAG;
                    comfirmBtn.frame = CGRectMake(coverView.bounds.size.width-60, 0, 60, 44);
                    [comfirmBtn setTitle:[StaticMethods getLanTextStrByKey:@"OK"] forState:UIControlStateNormal];
                    comfirmBtn.titleLabel.adjustsFontSizeToFitWidth = YES;
                    [comfirmBtn setTitleColor:RGBACOLOR(0, 122, 255, 1) forState:UIControlStateNormal];
                    [comfirmBtn addTarget:self action:@selector(timeAction:) forControlEvents:UIControlEventTouchUpInside];
                    
                    UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 44, coverView.frame.size.width, 219.0)];
                    pickerView.backgroundColor = [UIColor whiteColor];
                    pickerView.delegate = self;
                    pickerView.dataSource = self;
                    [pickerView selectRow:0 inComponent:0 animated:NO];
                    [self pickerView:pickerView didSelectRow:0 inComponent:0];
                    [pickerView selectRow:initValue2-1 inComponent:1 animated:NO];
                    [self pickerView:pickerView didSelectRow:initValue2-1 inComponent:1];
                    pickerView.tag = PICKERVIEW_TAG;
                    
                    UIView *buttonBgView = [[UIView alloc] initWithFrame:CGRectMake(0, coverView.frame.size.height, coverView.frame.size.width, 44+pickerView.frame.size.height)];
                    buttonBgView.tag = BUTTON_BG_VIEW_TAG;
                    buttonBgView.backgroundColor = RGBACOLOR(227, 227, 227, 1);
                    [buttonBgView addSubview:cancelBtn];
                    [buttonBgView addSubview:comfirmBtn];
                    [buttonBgView addSubview:pickerView];
                    
                    [self.view addSubview:coverView];
                    [self.view addSubview:buttonBgView];
                    [UIView animateWithDuration:0.2f animations:^{
                        coverView.alpha = 0.6;
                        buttonBgView.center = CGPointMake(buttonBgView.center.x, buttonBgView.center.y-buttonBgView.frame.size.height);
                    } completion:^(BOOL finished) {
                        
                    }];
                    [pickerView release];
                    [buttonBgView release];
                    [coverView release];



3, UIAlertView问题     

(1),早在IOS8.0的时候,苹果就推荐我们使用 UIAlertController 来代替UIAlerView,但是小编那个时候偷懒,UIalerView在IOS8.0 照样是可以用的,就没有去理会,但是IOS9.0更新的时候,测试那边发现 在IOS9.0系统下的设备 UIAlertView 圆角会变化 并且该控件会抖动,具体抖动的原因有可能是IOS9.0的动画做了修改,导致不兼容引起的。好,抖动,圆角变化是吧,没关系,把所有的UIalerView 做个判断 IOS8.0以上 就使用 UIAlertController,并且把动画设置为NO,好,这解决了抖动 和 圆角的问题,完美。。。

if (SYSTEM_IOS8)
    {
        if ([self.navigationController.visibleViewController isKindOfClass:[UIAlertController class]])
        {
            [self dismissViewControllerAnimated:NO completion:^{
                [ConnectManager writeLog:@"end Login"];
            }];
            return YES;
        }
    }
    else
    {
        if (self.retainAlertView && self.retainAlertView.tag==LOGIN_ALERTVIEW_TAG) {
            self.retainAlertView.delegate = nil;
            [self.retainAlertView dismissWithClickedButtonIndex:self.retainAlertView.cancelButtonIndex animated:NO];
            self.retainAlertView = nil;
            
            return YES;
        }
    }

 
   (2),改了之后,圆角 和 抖动 是没有了,但是self.navigationController.visibleViewController 貌似有所不同 了。用UIAlertController 之后,当该控件 弹出来 的时候  
   self 
   . 
   navigationController 
   . 
   visibleViewController 并不是 ViewControllers 堆栈中 元素,而是 UIAlertController对象(估计UIAlertController 是一个模态的形式弹出来的)。如果使用了self.navigationController.visibleViewController 做判断是否是self(self 指的是当前ViewController)的童鞋 要注意这可能会有些问题,小编 已经 把slef.navigationController.visibleViewController 改为了[self.navigationController.viewControllerslastObject]  来做判断了,这样就没有什么问题。 
  
以前是:
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (BOOL)isSelfShowInWindow
{
    if (self.navigationController.visibleViewController == self) //当前显示视图 是否是自己
    {
        //逻辑处理
        return YES;
    }
    return NO;
}
改为:
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (BOOL)isSelfShowInWindow
{
    if ([self.navigationController.viewControllers lastObject] == self) //当前显示视图 是否是自己
    {
        //逻辑处理
        return YES;
    }
    return NO;
}
 
   (3),以上两个问题 都是体力活,改好了之后没什么问题,但是又有新的问题: 
   模态弹出,系统动画冲突

小编编译app在跑着跑着的,突然发现 self.navigationController setViewControllers 这个方法没有执行,然后在控制台 看到 编译器 输出这么一句 “ while an existing transition or presentation is occurring; the navigation stack will not be updated,看到这句话 顿时就有点蒙了,仔细想了想应该UIAlertController引起的。很有可能是IOS9 系统动画冲突了,这个真是蛋疼,但是IOS8 好像也是又出现过。

UIAlertController 弹出是模态弹出,当这个弹出或者动画没有结束的时候,任何pop,push,setViewControllers 貌似都是没有用的。

解决的办法就是:延迟执行 push,pop ,setViewControllers 方法(系统卡顿 也可能会无法pop,push),或者自定义UIAlertController控件,当然不使用该控件也是可以的。


如有任何疑问,可加群询问,QQ群:77081333 


你可能感兴趣的:(IOS开发)