本文实例为大家分享了ios主题皮肤切换代码,供大家参考,具体内容如下
1. 主题皮肤功能切换介绍
主题切换就是根据用户设置不同的主题,来动态改变用户的界面,通常会改变navigationbar背景图片、tabbar背景图片、tabbar中的按钮的图片和选中的背景图片、navigationitem.title 标题的字体颜色、ui中其他元素控件
下载源代码地址: themeskinsetup.rar
2.项目目录结构及实现效果截图






3. 具体实现步骤
1.将image文件夹(group)和 skins拖入到项目工程中的资源文件夹中
2.创建baseviewcontroller
3.配置theme.plist
4.事项项目所需的基本框架供能,并实现主题的tableview功能
5.创建主题管理器:thememanager
6.自定义themetabbaritem 控件
7.创建ui工厂: uifactory
8. 实现tableview中的didselected事件完成主题切换
9.记录用户选择的主题,以便用户下次启动时是上次设置的主题
1.创建baseviewcontroller
?| 1 2 3 4 5 |
#import <uikit/uikit.h>
@interface baseviewcontroller : uiviewcontroller
- (void) reloadthemeimage;
@end
|
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#import "baseviewcontroller.h"
#import "thememanager.h"
#import "notificationmacro.h"
@interface baseviewcontroller ()
@end
@implementation baseviewcontroller
- (id) init {
if (self == [super init]) {
[[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(themechangednotfication:) name:kthemechangednotification object:nil];
}
[self reloadthemeimage];
return self;
}
- (void)viewdidload {
[super viewdidload];
[self reloadthemeimage];
}
- (void)didreceivememorywarning {
[super didreceivememorywarning];
// dispose of any resources that can be recreated.
}
- (void) themechangednotfication:(nsnotification *)notification {
[self reloadthemeimage];
}
- (void) reloadthemeimage {
thememanager * thememanager = [thememanager sharedthememanager];
uiimage * navigationbackgroundimage = [thememanager themeimagewithname:@"navigationbar_background.png"];
[self.navigationcontroller.navigationbar setbackgroundimage:navigationbackgroundimage forbarmetrics:uibarmetricsdefault];
uiimage * tabbarbackgroundimage = [thememanager themeimagewithname:@"tabbar_background.png"];
[self.tabbarcontroller.tabbar setbackgroundimage:tabbarbackgroundimage];
}
@end
|
2. 实现appdelegate
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#import "appdelegate.h"
#import "mainviewcontroller.h"
#import "thememanager.h"
#import "notificationmacro.h"
@interface appdelegate ()
@end
@implementation appdelegate
- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions {
[self inituserdefaultconfig];
mainviewcontroller * rootviewcontroller = [[mainviewcontroller alloc] init];
self.window.rootviewcontroller = rootviewcontroller;
return yes;
}
- (void) inituserdefaultconfig {
nsstring * themename = [[nsuserdefaults standarduserdefaults] objectforkey:kthemenamekey];
thememanager * thememanager = [thememanager sharedthememanager];
thememanager.themename = themename;
}</span></span>
|
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
<span style="font-weight: normal;"><span style="font-weight: normal;">#import "mainviewcontroller.h"
#import "homeviewcontroller.h"
#import "messageviewcontroller.h"
#import "mineviewcontroller.h"
#import "uifactory.h"
@interface mainviewcontroller ()
@end
@implementation mainviewcontroller
- (id) init {
if (self = [super init]) {
[self inittabbarui];
}
return self;
}
- (void)viewdidload {
[super viewdidload];
}
- (void)didreceivememorywarning {
[super didreceivememorywarning];
}
- (void) inittabbarui {
// 主页
homeviewcontroller * homeviewcontroller = [[homeviewcontroller alloc] init];
uinavigationcontroller * homenavigationcontroller = [[uinavigationcontroller alloc] initwithrootviewcontroller:homeviewcontroller];
// uitabbaritem * hometabbaritem = [[uitabbaritem alloc] initwithtitle:@"主页" image:[uiimage imagenamed:@"tabbar_home"] selectedimage:[uiimage imagenamed:@"tabbar_home_selected"]];
uitabbaritem * hometabbaritem = [uifactory createtabbaritemwithtitle:@"主页" imagename:@"tabbar_home" selectedimage:@"tabbar_home_selected"];
homenavigationcontroller.tabbaritem = hometabbaritem;
// 消息(中心)
messageviewcontroller * messageviewcontroller = [[messageviewcontroller alloc] init];
uinavigationcontroller * messagenavigationcontroller = [[uinavigationcontroller alloc] initwithrootviewcontroller:messageviewcontroller];
// uitabbaritem * messagetabbaritem = [[uitabbaritem alloc] initwithtitle:@"消息" image:[uiimage imagenamed:@"tabbar_message_center"] selectedimage:[uiimage imagenamed:@"tabbar_message_center_selected"]];
uitabbaritem * messagetabbaritem = [uifactory createtabbaritemwithtitle:@"消息" imagename:@"tabbar_message_center" selectedimage:@"tabbar_message_center_selected"];
messagenavigationcontroller.tabbaritem = messagetabbaritem;
// 我
mineviewcontroller * mineviewcontroller = [[mineviewcontroller alloc] init];
uinavigationcontroller * minenavigationcontroller = [[uinavigationcontroller alloc] initwithrootviewcontroller:mineviewcontroller];
// uitabbaritem * minetabbaritem = [[uitabbaritem alloc] initwithtitle:@"我" image:[uiimage imagenamed:@"tabbar_profile"] selectedimage:[uiimage imagenamed:@"tabbar_profile_selected"]];
uitabbaritem * minetabbaritem = [uifactory createtabbaritemwithtitle:@"我" imagename:@"tabbar_profile" selectedimage:@"tabbar_profile_selected"];
minenavigationcontroller.tabbaritem = minetabbaritem;
nsarray * viewcontrollers = @[homenavigationcontroller, messagenavigationcontroller, minenavigationcontroller];
self.viewcontrollers = viewcontrollers;
}
@end
|
3. 创建主题管理器
?| 1 2 3 4 5 6 7 8 9 10 11 12 |
#import <foundation/foundation.h>
#import <uikit/uikit.h>
@interface thememanager : nsobject
@property (nonatomic, copy) nsstring * themename; // 主题名字
@property (nonatomic, retain) nsdictionary * themeplistdict; // 主题属性列表字典
+ (thememanager *) sharedthememanager;
- (uiimage *) themeimagewithname:(nsstring *)imagename;
@end</span></span>
|
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
<span style="font-weight: normal;"><span style="font-weight: normal;">#import <foundation/foundation.h>
#import <uikit/uikit.h>
@interface thememanager : nsobject
@property (nonatomic, copy) nsstring * themename; // 主题名字
@property (nonatomic, retain) nsdictionary * themeplistdict; // 主题属性列表字典
+ (thememanager *) sharedthememanager;
- (uiimage *) themeimagewithname:(nsstring *)imagename;
@end
#import "thememanager.h"
#import "notificationmacro.h"
static thememanager * sharedthememanager;
@implementation thememanager
- (id) init {
if(self = [super init]) {
nsstring * themepath = [[nsbundle mainbundle] pathforresource:@"theme" oftype:@"plist"];
self.themeplistdict = [nsdictionary dictionarywithcontentsoffile:themepath];
self.themename = nil;
}
return self;
}
+ (thememanager *) sharedthememanager {
@synchronized(self) {
if (nil == sharedthememanager) {
sharedthememanager = [[thememanager alloc] init];
}
}
return sharedthememanager;
}
// override 重写themename的set方法
- (void) setthemename:(nsstring *)themename {
_themename = themename;
}
- (uiimage *) themeimagewithname:(nsstring *)imagename {
if (imagename == nil) {
return nil;
}
nsstring * themepath = [self themepath];
nsstring * themeimagepath = [themepath stringbyappendingpathcomponent:imagename];
uiimage * themeimage = [uiimage imagewithcontentsoffile:themeimagepath];
return themeimage;
}
// 返回主题路径
- (nsstring *)themepath {
nsstring * resourcepath = [[nsbundle mainbundle] resourcepath];
if (self.themename == nil || [self.themename isequaltostring:@""]) {
return resourcepath;
}
nsstring * themesubpath = [self.themeplistdict objectforkey:self.themename]; // skins/blue
nsstring * themefilepath = [resourcepath stringbyappendingpathcomponent:themesubpath]; // .../skins/blue
return themefilepath;
}
@end
|
4. 创建主题按钮 themetabbaritem
?| 1 2 3 4 5 6 7 8 9 10 |
#import <uikit/uikit.h>
@interface themetabbaritem : uitabbaritem
@property (nonatomic, copy) nsstring * imagename;
@property (nonatomic, copy) nsstring * selectedimagename;
- (id) initwithtitle:(nsstring *)title imagename:(nsstring *)imagename selectedimage:(nsstring *)selectedimagename;
@end </span></span>
|
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
<span style="font-weight: normal;"><span style="font-weight: normal;">#import "themetabbaritem.h"
#import "thememanager.h"
#import "notificationmacro.h"
@implementation themetabbaritem
// 初始化时注册观察者
- (id) init {
if (self = [super init]) {
[[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(themechangednotification:) name:kthemechangednotification object:nil];
}
return self;
}
- (id) initwithtitle:(nsstring *)title imagename:(nsstring *)imagename selectedimage:(nsstring *)selectedimagename {
if (self = [self init]) {
self.title = title;
self.imagename = imagename; // 此时会调用[self setimagename:imagename] ---> [self reloadthemeimage] --->[self setimage:image]
self.selectedimagename = selectedimagename;// 此时会调用[self setselectedimagename:selectedimagename];
}
return self;
}
#pragma mark -
#pragma mark - override setter
- (void) setimagename:(nsstring *)imagename {
if (_imagename != imagename) {
_imagename = imagename;
}
[self reloadthemeimage];
}
- (void) setselectedimagename:(nsstring *)selectedimagename {
if (_selectedimagename != selectedimagename) {
_selectedimagename = selectedimagename;
}
[self reloadthemeimage];
}
// 主题改变之后重新加载图片
- (void)themechangednotification:(nsnotification *)notification {
[self reloadthemeimage];
}
- (void)reloadthemeimage {
thememanager * thememanager = [thememanager sharedthememanager];
if (self.imagename != nil) {
uiimage * image = [thememanager themeimagewithname:self.imagename];
[self setimage:image];
}
if (self.selectedimagename != nil) {
uiimage * selectedimage = [thememanager themeimagewithname:self.selectedimagename];
[self setselectedimage:selectedimage];
}
}
- (void) dealloc {
[[nsnotificationcenter defaultcenter] removeobserver:self];
}
|
5. 创建ui工厂
?| 1 2 3 4 5 6 7 8 9 |
#import <foundation/foundation.h>
#import <uikit/uikit.h>
@interface uifactory : nsobject
+ (uitabbaritem *) createtabbaritemwithtitle:(nsstring *)title imagename:(nsstring *)imagename selectedimage:(nsstring *)selectedimagename;
@end</span></span>
|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<span style="font-weight: normal;"><span style="font-weight: normal;">#import <foundation/foundation.h>
#import <uikit/uikit.h>
@interface uifactory : nsobject
+ (uitabbaritem *) createtabbaritemwithtitle:(nsstring *)title imagename:(nsstring *)imagename selectedimage:(nsstring *)selectedimagename;
@end
#import "uifactory.h"
#import "themetabbaritem.h"
@implementation uifactory
+ (uitabbaritem *) createtabbaritemwithtitle:(nsstring *)title imagename:(nsstring *)imagename selectedimage:(nsstring *)selectedimagename {
themetabbaritem * themetabbaritem = [[themetabbaritem alloc] initwithtitle:title imagename:imagename selectedimage:selectedimagename];
return themetabbaritem;
}
@end
|
6. 实现选中单元格的事件
?| 1 2 3 4 5 6 7 8 9 |
#import "baseviewcontroller.h"
@interface mineviewcontroller : baseviewcontroller <uitableviewdelegate, uitableviewdatasource>
@property (weak, nonatomic) iboutlet uitableview *tableview;
@property (nonatomic, retain) nsmutablearray * themedatasource;
@end
|
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
#import "baseviewcontroller.h"
@interface mineviewcontroller : baseviewcontroller <uitableviewdelegate, uitableviewdatasource>
@property (weak, nonatomic) iboutlet uitableview *tableview;
@property (nonatomic, retain) nsmutablearray * themedatasource;
@end
#import "mineviewcontroller.h"
#import "thememanager.h"
#import "notificationmacro.h"
@interface mineviewcontroller ()
@end
@implementation mineviewcontroller
- (void)viewdidload {
[super viewdidload];
self.title = @"我";
thememanager * thememanager = [thememanager sharedthememanager];
_themedatasource = [nsmutablearray arraywitharray:thememanager.themeplistdict.allkeys];
}
- (void)didreceivememorywarning {
[super didreceivememorywarning];
// dispose of any resources that can be recreated.
}
#pragma mark -
#pragma mark - uitableviewdelegate
- (nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section {
return self.themedatasource.count;
}
- (uitableviewcell *) tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath {
static nsstring * identifier = @"cell";
uitableviewcell * cell = [tableview dequeuereusablecellwithidentifier:identifier];
if (cell == nil) {
cell = [[uitableviewcell alloc] initwithstyle:uitableviewcellstyledefault reuseidentifier:identifier];
}
nsstring * text = self.themedatasource[indexpath.row];
cell.textlabel.text = text;
thememanager * thememanager = [thememanager sharedthememanager];
nsstring * currenttheme = thememanager.themename;
if (currenttheme == nil) {
currenttheme = @"默认";
}
if ([currenttheme isequaltostring:text]) {
cell.accessorytype = uitableviewcellaccessorycheckmark;
} else {
cell.accessorytype = uitableviewcellaccessorynone;
}
return cell;
}
- (void)tableview:(uitableview *)tableview didselectrowatindexpath:(nsindexpath *)indexpath {
thememanager * thememanager = [thememanager sharedthememanager];
nsstring * themename = self.themedatasource[indexpath.row];
if ([themename isequaltostring:@"默认"]) {
themename = nil;
}
// 记录当前主题名字
thememanager.themename = themename;
[[nsnotificationcenter defaultcenter] postnotificationname:kthemechangednotification object:nil];
// 主题持久化
nsuserdefaults * userdefaults = [nsuserdefaults standarduserdefaults];
[userdefaults setobject:themename forkey:kthemenamekey];
[userdefaults synchronize];
// 重新加载数据显示uitableviewcellaccessorycheckmark 显示选中的对号 v
[self.tableview reloaddata];
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。








发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。