标签:
iOS开发项目篇—05主题设置
一、实现效果
1.效果图示
注意查看界面的导航栏
消息界面导航栏上的“写消息”
发现界面上的“系统设置”
“我”界面上德“设置”
2.实现说明
(1)适配IOS6和IOS7,要求导航标题栏和上面的按钮的设置基本一致。
(2)导航栏上德按钮,设置三种状态,默认状态下为橙色,不可用状态下为高亮灰色,点击(高亮)状态下为红色。
(3)设置导航栏上的按钮,有两种方式
第一种:下面是消息页面添加“写私信”的代码,可以在每次需要类似设置的时候都拷贝这样的代码。
1 //第一种方法,这种方法是有弊端的 2 /* 3 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 4 [button setTitle:@"写私信" forState:UIControlStateNormal]; 5 [button setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal]; 6 [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; 7 [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled]; 8 button.titleLabel.font = [UIFont systemFontOfSize:15]; 9 // 设置按钮文字的尺寸 为 按钮自己的尺寸 10 button.size = [button.currentTitle sizeWithFont:button.titleLabel.font]; 11 12 // 监听按钮点击 13 self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 14 self.navigationItem.rightBarButtonItem.enabled = NO; 15 */
第二种(推荐使用-设置其主题):
1 /** 2 *设置UIBarButtonItem的主题 3 */ 4 + (void)setupBarButtonItemTheme 5 { 6 //通过设置appearance对象,能够修改整个项目中所有UIBarButtonItem的样式 7 UIBarButtonItem *appearance=[UIBarButtonItem appearance]; 8 9 //设置文字的属性 10 //1.设置普通状态下文字的属性 11 NSMutableDictionary *textAttrs=[NSMutableDictionary dictionary]; 12 //设置字体 13 textAttrs[UITextAttributeFont]=[UIFont systemFontOfSize:15]; 14 //这是偏移量为0 15 textAttrs[UITextAttributeTextShadowOffset]=[NSValue valueWithUIOffset:UIOffsetZero]; 16 //设置颜色为橙色 17 textAttrs[UITextAttributeTextColor]=[UIColor orangeColor]; 18 [appearance setTitleTextAttributes:textAttrs forState:UIControlStateNormal]; 19 20 21 //2.设置高亮状态下文字的属性 22 //使用1中的textAttrs进行通用设置 23 NSMutableDictionary *hightextAttrs=[NSMutableDictionary dictionaryWithDictionary:textAttrs]; 24 //设置颜色为红色 25 hightextAttrs[UITextAttributeTextColor]=[UIColor redColor]; 26 [appearance setTitleTextAttributes:hightextAttrs forState:UIControlStateHighlighted]; 27 28 29 //3.设置不可用状态下文字的属性 30 //使用1中的textAttrs进行通用设置 31 NSMutableDictionary *disabletextAttrs=[NSMutableDictionary dictionaryWithDictionary:textAttrs]; 32 //设置颜色为灰色 33 disabletextAttrs[UITextAttributeTextColor]=[UIColor lightGrayColor]; 34 [appearance setTitleTextAttributes:disabletextAttrs forState:UIControlStateDisabled]; 35 36 //设置背景 37 //技巧提示:为了让某个按钮的背景消失,可以设置一张完全透明的背景图片 38 [appearance setBackButtonBackgroundImage:[UIImage imageWithName:@"navigationbar_button_background"]forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 39 }
二、代码实现
1.设置主题的代码:
YYUINavigationViewController.m文件
1 // 2 // YYUINavigationViewController.m 3 // 03-微博增加导航功能 4 // 5 6 #import "YYNavigationViewController.h" 7 8 @interface YYNavigationViewController () 9 10 @end 11 12 @implementation YYNavigationViewController 13 14 /** 15 *第一次调用类的时候会调用一次该方法 16 */ 17 +(void)initialize 18 { 19 //设置UIBarButtonItem的主题 20 [self setupBarButtonItemTheme]; 21 22 //设置UINavigationBar的主题 23 [self setupNavigationBarTheme]; 24 } 25 26 /** 27 *设置UINavigationBar的主题 28 */ 29 + (void)setupNavigationBarTheme 30 { 31 //通过设置appearance对象,能够修改整个项目中所有UINavigationBar的样式 32 UINavigationBar *appearance=[UINavigationBar appearance]; 33 34 //设置导航栏的背景 35 if (!iOS7) { 36 [appearance setBackgroundImage:[UIImage imageWithName:@"navigationbar_background"] forBarMetrics:UIBarMetricsDefault]; 37 } 38 39 //设置文字属性 40 NSMutableDictionary *textAttrs=[NSMutableDictionary dictionary]; 41 //设置字体颜色 42 textAttrs[UITextAttributeTextColor]=[UIColor blackColor]; 43 //设置字体 44 textAttrs[UITextAttributeFont]=[UIFont boldSystemFontOfSize:20]; 45 //设置字体的偏移量(0) 46 //说明:UIOffsetZero是结构体,只有包装成NSValue对象才能放进字典中 47 textAttrs[UITextAttributeTextShadowOffset]=[NSValue valueWithUIOffset:UIOffsetZero]; 48 [appearance setTitleTextAttributes:textAttrs]; 49 } 50 51 /** 52 *设置UIBarButtonItem的主题 53 */ 54 + (void)setupBarButtonItemTheme 55 { 56 //通过设置appearance对象,能够修改整个项目中所有UIBarButtonItem的样式 57 UIBarButtonItem *appearance=[UIBarButtonItem appearance]; 58 59 //设置文字的属性 60 //1.设置普通状态下文字的属性 61 NSMutableDictionary *textAttrs=[NSMutableDictionary dictionary]; 62 //设置字体 63 textAttrs[UITextAttributeFont]=[UIFont systemFontOfSize:15]; 64 //这是偏移量为0 65 textAttrs[UITextAttributeTextShadowOffset]=[NSValue valueWithUIOffset:UIOffsetZero]; 66 //设置颜色为橙色 67 textAttrs[UITextAttributeTextColor]=[UIColor orangeColor]; 68 [appearance setTitleTextAttributes:textAttrs forState:UIControlStateNormal]; 69 70 71 //2.设置高亮状态下文字的属性 72 //使用1中的textAttrs进行通用设置 73 NSMutableDictionary *hightextAttrs=[NSMutableDictionary dictionaryWithDictionary:textAttrs]; 74 //设置颜色为红色 75 hightextAttrs[UITextAttributeTextColor]=[UIColor redColor]; 76 [appearance setTitleTextAttributes:hightextAttrs forState:UIControlStateHighlighted]; 77 78 79 //3.设置不可用状态下文字的属性 80 //使用1中的textAttrs进行通用设置 81 NSMutableDictionary *disabletextAttrs=[NSMutableDictionary dictionaryWithDictionary:textAttrs]; 82 //设置颜色为灰色 83 disabletextAttrs[UITextAttributeTextColor]=[UIColor lightGrayColor]; 84 [appearance setTitleTextAttributes:disabletextAttrs forState:UIControlStateDisabled]; 85 86 //设置背景 87 //技巧提示:为了让某个按钮的背景消失,可以设置一张完全透明的背景图片 88 [appearance setBackButtonBackgroundImage:[UIImage imageWithName:@"navigationbar_button_background"]forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 89 } 90 91 /** 92 * 当导航控制器的view创建完毕就调用 93 */ 94 - (void)viewDidLoad 95 { 96 [super viewDidLoad]; 97 } 98 99 /** 100 * 能够拦截所有push进来的子控制器 101 */ 102 -(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated 103 { 104 //如果现在push的不是栈顶控制器,那么久隐藏tabbar工具条 105 if (self.viewControllers.count>0) { 106 viewController.hidesBottomBarWhenPushed=YES; 107 108 //拦截push操作,设置导航栏的左上角和右上角按钮 109 viewController.navigationItem.leftBarButtonItem=[UIBarButtonItem itemWithImageName:@"navigationbar_back" highImageName:@"navigationbar_back_highlighted" target:self action:@selector(back)]; 110 viewController.navigationItem.rightBarButtonItem=[UIBarButtonItem itemWithImageName:@"navigationbar_more" highImageName:@"navigationbar_more_highlighted" target:self action:@selector(more)]; 111 112 } 113 [super pushViewController:viewController animated:YES]; 114 } 115 116 -(void)back 117 { 118 #warning 这里用的是self, 因为self就是当前正在使用的导航控制器 119 [self popViewControllerAnimated:YES]; 120 } 121 122 -(void)more 123 { 124 [self popToRootViewControllerAnimated:YES]; 125 } 126 127 @end
每个界面设置的代码:
消息界面,设置写消息为不可用状态
YYMessageViewController.m文件
1 // 2 // YYMessageViewController.m 3 // 4 // 5 // 6 // 7 // 8 9 #import "YYMessageViewController.h" 10 11 @interface YYMessageViewController () 12 13 @end 14 15 @implementation YYMessageViewController 16 17 - (id)initWithStyle:(UITableViewStyle)style 18 { 19 self = [super initWithStyle:style]; 20 if (self) { 21 // Custom initialization 22 } 23 return self; 24 } 25 26 - (void)viewDidLoad 27 { 28 [super viewDidLoad]; 29 30 //第一种方法,这种方法是有弊端的 31 /* 32 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 33 [button setTitle:@"写私信" forState:UIControlStateNormal]; 34 [button setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal]; 35 [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; 36 [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled]; 37 button.titleLabel.font = [UIFont systemFontOfSize:15]; 38 // 设置按钮文字的尺寸 为 按钮自己的尺寸 39 button.size = [button.currentTitle sizeWithFont:button.titleLabel.font]; 40 41 // 监听按钮点击 42 self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 43 self.navigationItem.rightBarButtonItem.enabled = NO; 44 */ 45 46 //第二种方法 47 self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"写消息" style:UIBarButtonItemStyleDone target:self action:nil]; 48 //设置为不可用状态 49 self.navigationItem.rightBarButtonItem.enabled=NO; 50 } 51 52 53 #pragma mark - Table view data source 54 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 55 { 56 return 5; 57 } 58 59 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 60 { 61 static NSString *ID = @"cell"; 62 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; 63 if (!cell) { 64 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; 65 } 66 cell.textLabel.text = [NSString stringWithFormat:@"%d----消息页面的测试数据", indexPath.row]; 67 return cell; 68 } 69 70 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 71 { 72 //点击cell的时候,跳到下一个界面 73 UIViewController *newVc = [[UIViewController alloc] init]; 74 newVc.view.backgroundColor = [UIColor redColor]; 75 newVc.title = @"新控制器"; 76 [self.navigationController pushViewController:newVc animated:YES]; 77 } 78 79 @end
发现界面,设置“系统设置”,左边按钮为不可用状态,右边按钮为默认状态。
YYDiscoverViewController.m文件
1 // 2 // YYDiscoverViewController.m 3 // 02-微博添加子控制器和设置项目结构 4 // 5 6 #import "YYDiscoverViewController.h" 7 8 @interface YYDiscoverViewController () 9 10 @end 11 12 @implementation YYDiscoverViewController 13 14 - (void)viewDidLoad 15 { 16 [super viewDidLoad]; 17 18 self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"系统设置" style:UIBarButtonItemStyleDone target:self action:nil]; 19 20 self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"系统设置" style:UIBarButtonItemStyleDone target:self action:nil]; 21 22 //设置leftBarButtonItem为不可点击的 23 self.navigationItem.leftBarButtonItem.enabled=NO; 24 } 25 26 27 @end
2.代码说明:
(1)设置导航上标题的主题(粗体,去除阴影·设置偏移量为水平和垂直偏差均为0,结构体,只有包装秤NSValue对象,才能放进字典或数组中)
(2)修改按钮(只能通过设置它的主题来完成,第一种方法是不能完成的)
(3)提示:+initialize这个类方法会在第一次使用这个类的时候调用一次
3.设置导航栏时的技巧:
(1)做美工做一张透明的图片
(2)或者让美工做一张和导航栏一样的背景图片
4.重构代码(设置文字属性的)
使用dictionaryWithDictionary:
1 //2.设置高亮状态下文字的属性 2 //使用1中的textAttrs进行通用设置 3 NSMutableDictionary *hightextAttrs=[NSMutableDictionary dictionaryWithDictionary:textAttrs]; 4 //设置颜色为红色 5 hightextAttrs[UITextAttributeTextColor]=[UIColor redColor]; 6 [appearance setTitleTextAttributes:hightextAttrs forState:UIControlStateHighlighted];
新的问题:
模拟器在切换到ios7之后,导航栏下角有一条阴影线。是因为ios中,66-64多出了2个像素点。把导航栏的背景去掉后,即可解决。
在设置导航栏背景的时候,进行一次判断,如果是ios7那么就不设置导航栏背景。
1 //设置导航栏的背景 2 if (!iOS7) { 3 [appearance setBackgroundImage:[UIImage imageWithName:@"navigationbar_background"] forBarMetrics:UIBarMetricsDefault]; 4 }
三、重要提示
观察下面的代码:
1 /** 2 * 添加一个子控制器 3 * 4 * @param childVC 子控制对象 5 * @param title 标题 6 * @param imageName 图标 7 * @param selectedImageName 选中时的图标 8 */ 9 -(void)addOneChildVc:(UIViewController *)childVc title:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName 10 { 11 //随机设置子控制器的背景颜色 12 childVc.view.backgroundColor=YYRandomColor; 13 14 //设置标题 15 childVc.title=title; //相当于设置了后两者的标题 16 // childVc.navigationItem.title=title;//设置导航栏的标题 17 // childVc.tabBarItem.title=title;//设置tabbar上面的标题 18 19 //设置图标 20 childVc.tabBarItem.image=[UIImage imageWithName:imageName]; 21 //设置选中时的图标 22 UIImage *selectedImage=[UIImage imageWithName:selectedImageName]; 23 24 25 if (iOS7) { 26 // 声明这张图片用原图(别渲染) 27 selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 28 } 29 childVc.tabBarItem.selectedImage = selectedImage; 30 31 // 添加为tabbar控制器的子控制器 32 YYNavigationViewController *nav=[[YYNavigationViewController alloc]initWithRootViewController:childVc]; 33 34 [self addChildViewController:nav]; 35 36 }
说明:
在项目的YYTabBarViewController.m文件中,上面的方法中的第12行,随机设置子控制器的背景颜色会在调用的时候创建出“首页”、“消息”、“发现”、“我”四个view,覆盖掉项目中对按钮文字主题的设置。况且,从性能的角度来看,我们程序启动后,展现在用户眼前的只有“首页”这一个view,其它的VIew到用到的时候,再进行加载。把这行代码注释,就不会出现上面的问题。
标签:
原文地址:http://www.cnblogs.com/panyangjun/p/4318777.html