标签:
今天在实现公司项目5月版本的时候,碰到了一些问题,记录一下;
1.点击首页NavigationBar上的某个按钮,出发tabBar的点击事件,实现tabBar切换到对应的View
这次项目改版,为了改变之前赶进度不注重工程质量的问题,特意修改了整个应用的组织结构。但是研究了一下项目当前的TabBar,是在系统自带的TabBar上面盖了一个新的,并且还是继承于UIView(看来是准备完全自定义的,但是为啥又没有取代系统的TabBar呢,坑爹啊),然后在上面加了4个button.
显然,这个实现对于一般的需求(包括点击切换啊,变色啊)都可以胜任,但是这样带来的问题也不少,还记得MJ大神的视频说过,当你决定自定义一个自己的TabBar的时候,系统原生的TabBar就应该被你抛弃了;所以按照大神的思路,特意修改了一下实现:
1 -(void) creatTabBar 2 { 3 // 1.创建自定义的TabBar 4 _myTabBar= [[NJTabBar alloc] init]; 5 _myTabBar.delegate = self; 6 7 // 2.更换系统自带的tabbar 8 [self setValue:_myTabBar forKeyPath:@"tabBar"]; 9 10 // 3.设置每个TabBarItem的默认图片和选中时图片 11 for (int i = 0; i < self.viewControllers.count; i++) { 12 NSString *norImageName = [NSString stringWithFormat:@"tabBarItem%d", i + 1]; 13 NSString *selectedImageName = [NSString stringWithFormat:@"tabBarItem%dSelected", i + 1]; 14 15 UIViewController *childVC = [self.viewControllers objectAtIndex:i]; 16 // 设置图标 17 childVC.tabBarItem.image = [UIImage imageNamed:norImageName]; 18 // 设置选中的图标 19 UIImage *selectedImage = [UIImage imageNamed:selectedImageName]; 20 if (IOS7) { 21 // 声明这张图片用原图(别渲染) 22 selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 23 } 24 childVC.tabBarItem.selectedImage = selectedImage; 25 26 } 27 }
通过广播的方式,像tabbarController发送Notificaiton,收到以后解析内容,如果是点击事件,则切换tabBar,这里使用的时tabbarController的代理方法,代码如下:(因为这里tabBarItem在我的项目中都是确定的,所以Index我就写死了)
1 - (void)FenLeiPressed:(NSNotification*)notify 2 { 3 if ([notify.object isEqual:@"Fenlei"]) 4 { 5 UIViewController *childVC = [self.viewControllers objectAtIndex:1]; 6 [self setSelectedViewController:childVC]; 7 } 8 }
2.自定义UISearchBar里面placeHolder在iOS6系统中,文字位置偏上,iOS7正常
这个问题真是蛋疼,按说现在都2015年5月,苹果再过4个月马上就退出iOS9了,但是我司还是要求支持iOS6......据说是做了调查说目前还有10%的用户在使用iOS6系统。
没办法,外事不决问度娘,作为程序员中逼格不高的胶水民工,总是期待着我现在的坑已经有大神碰到过了。果然,找到了一个解决办法:
1 //重写父类方法,实现iOS6下面占位符文字居中 2 - (CGRect)placeholderRectForBounds:(CGRect)bounds 3 { 4 if (iOS_Version < 7.0f) { 5 CGRect inset = CGRectMake(bounds.origin.x+30, bounds.origin.y+5, bounds.size.width-96, bounds.size.height); 6 return inset; 7 }else { 8 return [super placeholderRectForBounds:bounds]; 9 } 10 11 }
其实就是重写了父类的方法,在iOS6系统下重新设定了placeHolder占位的边界;如果不是这种情况,则正常放回父类的结果即可(一开始傻X了,else这行没写,各种没有文字显示)。
总结:
1.遇到问题不要慌,已经有很多同伴踩过你的坑了,要相信这一点。
2.对于基础知识要扎实,大神的视频要经常看,这次的tabBar自定义其实就是个很好的例子,要好好消化一下。
3.编程要养成想清楚再写的习惯,要有一条主线,分清轻重缓急。
OK,good night!
标签:
原文地址:http://www.cnblogs.com/wdwblue/p/4496037.html