关于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