一步一步实现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.项目目录结构及实现效果截图
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]; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。