本文实例为大家分享了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]; 
}
 | 
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。
相关文章
             猜你喜欢
        
        - 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
 - 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
 - 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
 - ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
 - ASP.NET自助建站系统的域名绑定与解析教程 2025-06-10
 
			TA的动态
			
		
				- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
 - 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
 - 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
 - 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
 - 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
 
快网idc优惠网
QQ交流群
				您的支持,是我们最大的动力!				
			
		
        热门文章
        
    
    - 
            2025-05-29 28
 - 
            2025-05-29 93
 - 
            2025-06-04 85
 - 
            
在 VPS 服务器上部署 DeepSeek 需要什么配置?怎么部署?
2025-05-25 100 - 
            2025-05-27 33
 
		热门评论
	
	
        






    		
            	
        
        