项目中遇到的问题-1

  今天在实现公司项目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!

  

原文地址:https://www.cnblogs.com/wdwblue/p/4496037.html