iOS开发项目篇—05主题设置

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到用到的时候,再进行加载。把这行代码注释,就不会出现上面的问题。

时间: 2024-12-26 03:44:06

iOS开发项目篇—05主题设置的相关文章

iOS开发项目篇—13标题栏设置

iOS开发项目篇—13标题栏设置 一.添加标题栏 代码: 1 #import "YYHomeTableViewController.h" 2 #import "YYOneViewController.h" 3 4 @interface YYHomeTableViewController () 5 6 @end 7 8 @implementation YYHomeTableViewController 9 10 - (id)initWithStyle:(UITable

iOS开发项目篇—04添加导航栏的按钮

iOS开发项目篇—04添加导航栏的按钮 一.设置导航栏的按钮 要求实现的效果:             说明:默认状态下和高亮状态下的图片是不一样的. 按钮的图片需要设置默认状态和高亮状态时的显示,系统了提供的下面方法 viewController.navigationItem.leftBarButtonItem=[UIBarButtonItem alloc]initWithImage:<#(UIImage *)#> style:<#(UIBarButtonItemStyle)#>

iOS开发项目篇—54&quot;设置&quot;界面的搭建

iOS开发项目篇—54"设置"界面的搭建 一.实现 新建一个设置控制器,当点击“我”控制器导航栏“设置”按钮时,即跳转到该界面 1.在“我”控制器中对导航栏“设置按钮”的处理 1 // 2 // YYProfileViewController.m 3 // 4 5 #import "YYProfileViewController.h" 6 #import "YYCommonGroup.h" 7 #import "YYCommonItem

iOS开发项目篇—50设置cell的背景

iOS开发项目篇—50设置cell的背景 一.简单说明 当前样式: 1.去掉分隔线 2.设置背景图片(新浪提供了四种图片,底部的图片有阴影) cell的四种背景图 问题:cell怎么知道自己当前是处在第几组的第几行? 在自定义cell中提供一个方法,共外界传递当前的组和行 YYCommonCell.h文件 1 // 2 // YYCommonCell.h 3 // 4 5 #import <Foundation/Foundation.h> 6 @class YYCommonItem; 7 @i

学习IOS开发项目篇--如何让程序在后台保持挂起状态

程序的状态分为:前台运行,后台挂起,后台休眠,为了让项目的网络请求保持活跃状态,需要对程序进行设置. 在applicationDidEnterBackground方法中调用下面的方法,可以让程序进入挂起状态,但在未知时间内,可能会被系统设置为休眠,如果在将程序设置为播放器,并且循环播放一个MP3文件,可以保持永久挂起状态. UIBackgroundTaskIdentifier task =[application beginBackgroundTaskWithExpirationHandler:

iOS开发项目篇—28自定义UITextView

iOS开发项目篇—28自定义UITextView 一.简单说明 1.要实现的效果 2.分析 (1)UITextField 1.最多只能输入一行文字 2.能设置提醒文字(placehoder) 3.不具备滚动功能 (2)UITextView 1.能输入N行文字(N>0) 2.不能设置提醒文字(没有placehoder属性) 3.具备滚动功能 需求:技能输入多行文字,又具备文字提醒功能. 这里选择自定义一个类,让其继承自UITextView类,为其添加一个设置文字提醒的功能. 二.实现 自定义UI控

iOS开发项目篇—20存储账号信息

iOS开发项目篇—20存储账号信息 一.简单说明 1.不论请求是否成功,都在发送Post请求后,隐藏遮罩. 2.在授权成功后,切换根控制器. (1)说明 切换到控制器有几种情况,要么是切换到新特性,要么是切换到“首页”. 没有必要每次进入程序都需要登录,且每次返回的数据都是一样的,所以只需要把拿到的信息保存到沙盒里就可以了. 判断上次有没有登录成功(把拿到的access_token保存到沙盒中,如果沙盒中有access_token,说明上次登录成功),如果上次登陆成功,那么就判断是否要进入新特性

iOS开发项目篇—36封装微博业务

iOS开发项目篇—36封装微博业务 一.简单说明 1.请求参数面向模型 2.请求结果面向模型 3.对控制器来说应该屏蔽业务细节.不让控制器关心(知道)业务细节,它只需要知道自己在做某个业务 @通过一个专门的业务处理类:处理微博业务细节 说明: 业务:加载新的微博首页数据 实现:给新浪服务器发送一个GET请求 业务:加载更多的首页微博数据 实现1:给新浪服务器发送一个GET请求 实现2:去沙盒中加载以前离线缓存的微博数据  二.实现 1.新建一个微博业务处理类,继承自NSObject 微博业务处理

iOS开发项目篇—34获取用户信息

iOS开发项目篇—34获取用户信息 一.简单说明 需求:获取当前用户的昵称 ,需要获取当前登录用户的个人信息. 查看接口 要求传递的参数 这里要获取的时用户的昵称(所以使用用户id作为参数传入) 二.实现代码 1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 //设置导航栏内容 6 [self setupNavBar]; 7 8 //集成刷新控件 9 [self setupRefresh]; 10 11 //设置用户的昵称为标题 12 [s