苹果从iOS5开始提供了一个比较强大的工具UIAppearance,我们可以通过UIAppearance设置一些UI的全局效果,这样就可以很方便的实现UI的自定义效果又能最简单的实现统一界面风格。
方法介绍
+ (id)appearance
- 这个方法是统一全部改,比如你设置UINavBar的tintColor,你可以这样写:
[[UINavigationBar appearance] setTintColor:myColor];
+ (id)appearanceWhenContainedIn:(Class <>)ContainerClass,...
- 这个方法可设置某个类的改变:例如:设置UIBarButtonItem 在UINavigationBar、UIPopoverController、UITabbar中的效果。就可以这样写
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], [UIPopoverController class],[UITabbar class] nil] setTintColor:myPopoverNavBarColor];
使用注意
-
iOS8以后又添加了一些方法,这里就不做介绍了,我们开发中最长用到的还是第1种方法
-
我们在查看方法或者属性的时候,若是看到方法或属性的后面是UI_APPEARANCE_SELECTOR的,我们就可以通过appearance统一设置相关的属性
-
注意 : 使用appearance设置UI效果最好采用全局的设置,在所有界面初始化前开始设置,否则可能失效。
代码示例
统一设置TabBarItem的文字属性
- (void)setUpTabBarItemAttrs{ UITabBarItem *item = [UITabBarItem appearance]; NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary]; normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:15]; normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor]; [item setTitleTextAttributes:normalAttrs forState:UIControlStateNormal]; NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary]; selectedAttrs[NSForegroundColorAttributeName] = [UIColor blackColor]; [item setTitleTextAttributes:selectedAttrs forState:UIControlStateSelected];
}
单例(singleton) May 15, 2014
什么是单例模式
-
单例模式 是一个类在系统中只有一个实例对象。通过全局的一个入口点对这个实例对象进行访问。在iOS开发中,单例模式是非常有用的一种设计模式。
-
可以保证在程序运行过程,一个类只有一个实例
实现单例模式的条件
-
实现单例模式有三个条件:
- 类的构造方法是私有的
- 类提供一个类方法用于产生对象
- 类中有一个私有的自己对象
-
针对于这三个条件,OC中都是可以做到的
- 类的构造方法是私有的 我们只需要重写allocWithZone方法,让初始化操作只执行一次
- 类提供一个类方法产生对象 这个可以直接定义一个类方法
- 类中有一个私有的自己对象 我们可以在.m文件中定义一个属性即可
应用场景及注意点
-
应用场景
- 某个类经常被使用(节约系统资源)
- 定义工具类
- 共享数据
-
注意点
- 不要继承单例类
- 先创建子类永远是子类对象
- 先创建父类永远是父类对象
-
单例模式:
- 懒汉模式
: 第一次用到单例对象的时候再创建
- 饿汉模式
: 一进入程序就创建一个单例对象
ARC
懒汉模式
#import "Singleton.h"
@implementation Singletonstatic id _instance;+ (instancetype)allocWithZone:(struct _NSZone *)zone{ if (_instance == nil) { // 防止频繁加锁 @synchronized(self) { if (_instance == nil) { // 防止创建多次 _instance = [super allocWithZone:zone]; } } } return _instance;}+ (instancetype)sharedSingleton{ if (_instance == nil) { // 防止频繁加锁 @synchronized(self) { if (_instance == nil) { // 防止创建多次 _instance = [[self alloc] init]; } } } return _instance;}- (id)copyWithZone:(NSZone *)zone{ return _instance;}@end
饿汉模式(不常用)
#import "HMSingleton.h"
@implementation Singletonstatic id _instance;+ (void)load{ _instance = [[self alloc] init];}+ (instancetype)allocWithZone:(struct _NSZone *)zone{ if (_instance == nil) { // 防止创建多次 _instance = [super allocWithZone:zone]; } return _instance;}+ (instancetype)sharedSingleton{ return _instance;}- (id)copyWithZone:(NSZone *)zone{ return _instance;}@end
GCD实现单例模式
@implementation
Singletonstatic id _instance;+ (instancetype)allocWithZone:(struct _NSZone *)zone{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [super allocWithZone:zone]; }); return _instance;}+ (instancetype)sharedSingleton{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; }); return _instance;}- (id)copyWithZone:(NSZone *)zone{ return _instance;}@end
非ARC
在非ARC的环境下,需要再加上下面的方法:
- 重写release方法为空
- 重写retain方法返回自己
- 重写retainCount返回1
- 重写autorelease返回自己
-
(oneway void)release { }- (id)retain { return self; }- (NSUInteger)retainCount { return 1;}- (id)autorelease { return self;}
- 如何判断是否是ARC
#if __has_feature(objc_arc)
//ARC环境 #else //MRC环境 #endif
- 学习ios 重要还是要理清楚思路 在做或者看老师代码的时候 自己多想想为什么 不要自己看着就抄 另外还是要推荐一下 蓝懿IOS这个培训机构 和刘国斌老师刘国斌老师还是很有名气的,听朋友说刘老师成立了蓝懿iOS,,老师讲课方式很独特,能够尽量让每个人都能弄明白,有的比较难懂的地方,如果有的地方还是不懂得话,老师会换个其它方法再讲解,这对于我们这些学习iOS的同学是非常好的,多种方式的讲解会理解得更全面,这个必须得给个赞,嘻嘻,还有就是这里的学习环境很好,很安静,可以很安心的学习,安静的环境是学习的基础,小班讲课,每个班20几个学生,学习氛围非常好,每天都学到9点多才离开教室,练习的时间很充裕,而且如果在练习的过程中有什么困难,随时可以向老师求助,不像其它机构,通过视频教学,有的甚至学完之后都看不到讲师本人,问点问题都不方便,这就是蓝懿与其它机构的区别,相信在刘国斌老师的细心指导下,每个蓝懿学员都能找到满意的工作,加油!
-
写博客第一百零四天;
QQ:565803433