iOS UIAppearance最全详解

iOS5及其以后提供了一个比较强大的工具UIAppearance,我们通过UIAppearance设置一些UI的全局效果,这样就可以很方便的实现UI的自定义效果又能最简单的实现统一界面风格,它提供如下两个方法。

+ (id)appearance

这个方法是统一全部改,比如你设置UINavBar的tintColor,你可以这样写:[[UINavigationBarappearance] setTintColor:myColor];


+ (id)appearanceWhenContainedIn:(Class<>)ContainerClass,...

这个方法可设置某个类的改变:例如:设置UIBarButtonItem在UINavigationBar、UIPopoverController、UITabbar中的效果。就可以这样写

[[UIBarButtonItemappearanceWhenContainedIn:[UINavigationBar class],[UIPopoverController class],[UITabbar class] nil]setTintColor:myPopoverNavBarColor];


请注意*使用appearance设置UI效果最好采用全局的设置,在所有界面初始化前开始设置,否则可能失效。


 具体UI外观修改如下:


1.修改导航栏背景

代码如下:

   UINavigationBar * appearance = [UINavigationBarappearance];

    UIImage *navBackgroundImg =[UIImage imageNamed:@"navBg.png”];

   

   [appearancesetBackgroundImage:navBackgroundImg forBarMetrics:UIBarMetricsDefault];


2.标签栏(UITabbar

代码如下:

    UITabBar *appearance = [UITabBar appearance];

   //设置背景图片

   [appearancesetBackgroundImage:[UIImageimageNamed:@"tabbar_bg.png"]];

   //门置选择item的背景图片

   UIImage *selectionIndicatorImage =[[UIImage imageNamed:@"tabbar_slider"]resizableImageWithCapInsets:UIEdgeInsetsMake(4,0, 0,0)] ;

    [appearancesetSelectionIndicatorImage:selectionIndicatorImage];


3.分段控件(UISegmentControl

代码如下:

   UISegmentedControl *appearance = [UISegmentedControlappearance];

   

   //Segmenteg正常背景

   [appearancesetBackgroundImage:[UIImageimageNamed:@"Segmente.png"]

                   forState:UIControlStateNormal

                  barMetrics:UIBarMetricsDefault];

   

   //Segmente选中背景

   [appearancesetBackgroundImage:[UIImageimageNamed:@"Segmente_a.png"]

                   forState:UIControlStateSelected

                  barMetrics:UIBarMetricsDefault];

   

   //Segmente左右都未选中时的分割线

   //BarMetrics表示navigationbar的状态,UIBarMetricsDefault表示portrait状态(44pixelheight),UIBarMetricsLandscapePhone表示landscape状态(32pixelheight

   

   [appearancesetDividerImage:[UIImage imageNamed:@"Segmente_line.png"]

         forLeftSegmentState:UIControlStateNormal

          rightSegmentState:UIControlStateNormal

                barMetrics:UIBarMetricsDefault];

   

   [appearancesetDividerImage:[UIImage imageNamed:@"Segmente_line.png"]

         forLeftSegmentState:UIControlStateSelected

          rightSegmentState:UIControlStateNormal

                barMetrics:UIBarMetricsDefault];

   

   [appearancesetDividerImage:[UIImage imageNamed:@"Segmente_line.png"]

         forLeftSegmentState:UIControlStateNormal

          rightSegmentState:UIControlStateSelected

                barMetrics:UIBarMetricsDefault];

   

    //字体

   NSDictionary *textAttributes1 = @{UITextAttributeFont: [UIFont systemFontOfSize:18],

                            UITextAttributeTextColor:[UIColor blueColor],

                            UITextAttributeTextShadowColor:[UIColor whiteColor],

                            UITextAttributeTextShadowOffset:[NSValue valueWithCGSize:CGSizeMake(1, 1)]};

   

    [appearancesetTitleTextAttributes:textAttributes1forState:1];

   

   NSDictionary *textAttributes2 = @{UITextAttributeFont: [UIFont systemFontOfSize:18],

                            UITextAttributeTextColor:[UIColor whiteColor],

                            UITextAttributeTextShadowColor:[UIColor blackColor],

                            UITextAttributeTextShadowOffset:[NSValue valueWithCGSize:CGSizeMake(1, 1)]};

   

    [appearancesetTitleTextAttributes:textAttributes2forState:0];



4.UIBarbutton

注意UIBarbuttonleftBarButtonrightBarButtonbackBarButton,其中backBarButton由于带有箭头,需要单独设置。

barButton背景设置是ios6.0及以后的,而backbuttonios5.0及以后的,这里要注意!

代码如下:

   //修改导航条上的UIBarButtonItem

   UIBarButtonItem *appearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBarclass], nil];


   //设置导航栏的字体包括backBarButtonleftBarButtonrightBarButton的字体

   NSDictionary *textAttributes = @{UITextAttributeFont: [UIFont systemFontOfSize:18],

                            UITextAttributeTextColor:[UIColor blueColor],

                            UITextAttributeTextShadowColor:[UIColor whiteColor],

                            UITextAttributeTextShadowOffset:[NSValue valueWithCGSize:CGSizeMake(1, 1)]};

   

    [appearancesetTitleTextAttributes:textAttributesforState:1];//forState0时为下正常状态,为1时为点击状态。


   

   //修改leftBarButtonrightBarButton背景效果

   [appearancesetBackgroundImage:[UIImageimageNamed:@"navBarButton.png"]

                   forState:UIControlStateNormal

                      style:UIBarButtonItemStyleBordered

                  barMetrics:UIBarMetricsDefault];

   

   [appearancesetBackgroundImage:[UIImageimageNamed:@"navBarButton_a.png"]

                   forState:UIControlStateHighlighted

                      style:UIBarButtonItemStyleBordered

                  barMetrics:UIBarMetricsDefault];


   

   //backBarButton需要单独设置背景效果。只能在ios6.0以后才能用

   [appearancesetBackButtonBackgroundImage:[UIImage imageNamed:@"nav_bg.png"]

                            forState:0

                          barMetrics:UIBarMetricsDefault];

   

   [appearancesetBackButtonBackgroundImage:[UIImage imageNamed:@"work.png"]

                            forState:1

                          barMetrics:UIBarMetricsDefault];

   

   [appearancesetBackButtonTitlePositionAdjustment:UIOffsetMake(2,-1)

                              forBarMetrics:UIBarMetricsDefault];


5.工具栏(UIToolbar


   UIToolbar *appearance = [UIToolbar appearance];

   //样式和背景二选一即可,看需求了

   //样式(黑色半透明,不透明等)设置

   [appearancesetBarStyle:UIBarStyleBlackTranslucent];

   //背景设置

   [appearancesetBackgroundImage:[UIImageimageNamed:@"toolbarBg.png"]

            forToolbarPosition:UIToolbarPositionAny

                  barMetrics:UIBarMetricsDefault];









做App时,我们经常需要自定义一些界面展现,来适合我们App的内容,或来使App看起来更漂亮,有时我们不得不写大量的自定义控件来达到这个目的。iOS5新增了UIAppearance协议,使得自定义风格简单方便了很多,通过UIAppearance协议,我们快速的修改系统内置的控件的外观,也可以自己定义一些可自定义外观的控件。

系统框架控件的一些自定义方法

自定义导航条背景

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"background"] forBarMetrics:UIBarMetricsDefault];

自定义导航标题文字属性

[[UINavigationBar appearance] setTitleTextAttributes:@{UITextAttributeTextColor:[UIColor darkGrayColor],UITextAttributeTextShadowColor:[UIColor clearColor]}];

可自定义标题字体,颜色,阴影。

自定义导航条返回和左右按钮按钮背景

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setBackButtonBackgroundImage:[UIImage imageNamed:@"back_button_background"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar 
class], nil] setBackgroundImage:[UIImage 
imageNamed:@"button_background"] forState:UIControlStateNormal 
barMetrics:UIBarMetricsDefault];

自定义底部Tab条的背景

[[UITabBar appearance] setBackgroundImage:[UIImage imageNamed:@"background"]];

自定义底部条标题文字属性

[[UITabBarItem appearance] setTitleTextAttributes:@{UITextAttributeTextColor:[UIColor grayColor]} forState:UIControlStateNormal];
[[UITabBarItem appearance] setTitleTextAttributes:@{UITextAttributeTextColor:[UIColor orangeColor]} forState:UIControlStateSelected];

这里列举的都是一些最常用的自定义方法,只要是头文件中有“UI_APPEARANCE_SELECTOR”标记的方法都是可以用UIAppearance协议对象去调的。注意这些自定义方法都要在相应的对象显示之前调用,可以放到App启动后立刻配置,以后只要这个对象显示之前,就会设置相应的属性。

自己创建一个可自定义外观的控件

对于我们自己定义的控件,也可以支持UIAppearance协议,这样我们的控件也能支持自定义了。你只需要写一个设置外观的settor,然后在settor方法后面加上“UI_APPEARANCE_SELECTOR”标记就可以,其他什么都不需要做。比如一个可以自定义选择状态背景颜色的TableViewCell。

@interface CustomCell : UITableViewCell
- (void)setSelectedBackgroundColor:(UIColor*)color UI_APPEARANCE_SELECTOR;
@end

@implementation CustomCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.selectedBackgroundView = [UIView new];
        self.selectedBackgroundView.backgroundColor = [UIColor lightGrayColor];
    }
    return self;
}
- (void)setSelectedBackgroundColor:(UIColor*)color{
    self.selectedBackgroundView.backgroundColor = color;
}
@end

注意,官方文档中强调Appearance的setter定义格式应为:

- (void)setProperty:(PropertyType)property forAxis1:(IntegerType)axis1 axis2:(IntegerType)axis2 axisN:(IntegerType)axisN;
- (PropertyType)propertyForAxis1:(IntegerType)axis1 axis2:(IntegerType)axis2 axisN:(IntegerType)axisN;

UIAppearance实现原理

在通过UIAppearance调用“UI_APPEARANCE_SELECTOR”标记的方法来配置外观时,UIAppearance实际上没有进行任何实际调用,而是把这个调用保存起来(在Objc中可以用NSInvocation对象来保存一个调用)。当实际的对象显示之前(添加到窗口上,drawRect:之前),就会对这个对象调用之前保存的调用。当这个setter调用后,你的界面风格自定义就完成了。

你可能感兴趣的:(iOS UIAppearance最全详解)