欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

一步一步实现iOS主题皮肤切换效果

程序员文章站 2023-12-20 09:04:58
本文实例为大家分享了ios主题皮肤切换代码,供大家参考,具体内容如下 1. 主题皮肤功能切换介绍 主题切换就是根据用户设置不同的主题,来动态改变用户的界面,通常会改变n...

本文实例为大家分享了ios主题皮肤切换代码,供大家参考,具体内容如下

1. 主题皮肤功能切换介绍
主题切换就是根据用户设置不同的主题,来动态改变用户的界面,通常会改变navigationbar背景图片、tabbar背景图片、tabbar中的按钮的图片和选中的背景图片、navigationitem.title 标题的字体颜色、ui中其他元素控件

下载源代码地址: http://xiazai.jb51.net/201609/yuanma/themeskinsetup(jb51.net).rar

2.项目目录结构及实现效果截图

一步一步实现iOS主题皮肤切换效果

一步一步实现iOS主题皮肤切换效果

一步一步实现iOS主题皮肤切换效果

一步一步实现iOS主题皮肤切换效果

一步一步实现iOS主题皮肤切换效果

一步一步实现iOS主题皮肤切换效果

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

#import <uikit/uikit.h> 
@interface baseviewcontroller : uiviewcontroller 
 
- (void) reloadthemeimage; 
@end 

#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

#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> 

<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. 创建主题管理器

#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> 

<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

#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> 

<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工厂

#import <foundation/foundation.h> 
#import <uikit/uikit.h> 
 
@interface uifactory : nsobject 
 
+ (uitabbaritem *) createtabbaritemwithtitle:(nsstring *)title imagename:(nsstring *)imagename selectedimage:(nsstring *)selectedimagename; 
 
 
@end</span></span> 
<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. 实现选中单元格的事件

#import "baseviewcontroller.h" 
 
@interface mineviewcontroller : baseviewcontroller <uitableviewdelegate, uitableviewdatasource> 
 
 
@property (weak, nonatomic) iboutlet uitableview *tableview; 
 
@property (nonatomic, retain) nsmutablearray * themedatasource; 
@end 

#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]; 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: