当前位置: 移动技术网 > IT编程>移动开发>IOS > 一步一步实现iOS主题皮肤切换效果

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

席秀海,成人网址大全,咖啡色rgb

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

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

下载源代码地址:

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

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

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网