一行代码达成因势利导页,开拓框架入门开拓教程贰

前言:

框架仍旧在迅速更新着:在重构、简化代码,统一标准的长河中。

其中也遭遇种种坑,但是幸而一步壹脚印的缓解了。

就算如此还有个别成效还在揣摩,不过教程,依旧得补上:

上篇文章:Sagit.Framework For IOS
开垦框架入门开采教程2:1行代码实现因势利导页

其间讲到,指点完后,依据是不是留存的Token来缓解跳转到StartController依然MainController。

那篇就写写StartController,达成的代码虽少,但原理很奇妙!!!

前言:

框架还是在高速翻新着:在重构、简化代码,统1标准的长河中。

中等也蒙受种种坑,可是幸而一步1脚印的缓解了。

尽管如此还有个别作用还在思量,可是教程,如故得补上:

上篇小说:Sagit.Framework For IOS
开垦框架入门开荒教程2:一行代码达成因势利导页

内部讲到,引导完后,依照是或不是存在的Token来缓解跳转到StartController还是MainController。

那篇就写写StartController,达成的代码虽少,但原理很非凡!!!

Sagit 达成登录注册辅导页

从WelcomleController中,未来跳到了StartController了:

表现的故事情节如下图:(为不影响总体,那图宽高设的的异常的小,大伙能够新开窗口看大图):

图片 1

其一分界面,除了基础的布局,还有多个事件:

1:点及时登记:跳转到注册页。

贰:点登入:或跳转到登6页。

全体的效能如下:

图片 2

此处把View和Controller分开文件处理:

图片 3

看望StartView的布局的全方位代码:(下边是本身本身简化后的代码,从前的代码多到吓死人)

#import "STView.h"

@interface StartView : STView  //StartView.h

@end


@implementation StartView    //StartView.m

- (void)initUI
{
  if(self.STController!=nil && self.STController.navigationController==nil){

      [self.STController asRoot:RootViewNavigationType];} 

    [self needNavigationBar:NO setNavBar:YES];//隐藏导航栏。

    [[[self addImageView:@"logo" imgName:@"login_logo"] width:170 height:170] relate:LeftTopRight v:290 v2:200 v3:290];

    UILabel *title = [[[self addLabel:nil text:@"IT恋" font:48] width:160 height:44] onBottom:@"logo" y:50];
    [[title textColor:@"#000000"] textAlignment:NSTextAlignmentCenter];

    UILabel *description = [[[[self addLabel:nil text:@"找优质靠谱IT男就上IT恋" font:36] width:450 height:34] onBottom:title y:48] toCenter:X];
    [[description textColor:@"#000000"] textAlignment:NSTextAlignmentCenter];

    //框架调整,下面这几行代码有变化,具体见下文补充:

    UIButton *regBtn = [[[[self addButton:@"Reg" title:@"立即注册"] width:287 height:77] onBottom:description y:484] toCenter:X];
    [[regBtn backgroundImage:@"login_btn"] keyValue:@{@"leftNavImage":@"nav_arrow_left_black"}];

    UIButton *loginBtn = [[[[self addButton:@"Login" title:@"已有账号,立即登录" font:24] width:300 height:26] onBottom:regBtn y:60] toCenter:X];
    [[loginBtn titleColor:MainHexColor] keyValue:STPreView.keyValue];
}


@end

新添补内容:

新变化的两行代码的写法(新的调整是为了能够垄断导航栏的完全,包蕴标题及左侧的体裁【原来只好调控左边】):

[[[[this addButton:@"Reg" title:@"立即注册"] width:287 height:77] onBottom:STPreView y:484] toCenter:X];
    [[STLastButton backgroundImage:@"login_btn"] key:STNavConfig value:@{STNavTitle:@"账号注册",STNavLeftImage:@"nav_arrow_left_black"}];

    [[[[this addButton:@"Login" title:@"已有账号,立即登录" font:24] width:300 height:26] onBottom:STPreView y:60] toCenter:X];
    [[STLastButton titleColor:MainHexColor] block:nil on:^(UIView *view) {
       [view key:STNavConfig value:@{STNavTitle:@"登录",STNavLeftImage:@"nav_arrow_left_black"}];
    }];

 

代码功用疏解(第二点和第二点上面再细讲):

1:基本上一个控件布局就一行代码,直接看过去就好了。

2:第一行设置不需要导航栏,并直接隐藏导航栏:[self needNavigationBar:NO setNavBar:YES];//隐藏导航栏

3:注册和登陆按钮,多了一个陌生的keyValue,因为这里要控制导航的返回按钮为自定义的图片。

再看看StartController中的全体代码:

@interface StartController : STController //StartController.h
@end

@implementation StartController //StartContrller.m

-(instancetype)init
{
    //初始化全局设置,必须要在UI初始之前。
    [self configNavAndStatusBar];
    return self;
}
-(void)configNavAndStatusBar
{

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];//白色底,所以状态字颜色改为黑

    //这里提前统一设定全局协议的内容(对于登陆、注册、找回密码三个窗体有效),进入Main之后,会重新修改全局协议的内容
    [[[[[[UINavigationBar globalSetting] barTintColor:ColorWhite]tintColor:ColorBlack] backgroundImage:nil] shadowImage:nil]
     titleTextAttributes:@{NSForegroundColorAttributeName:ColorBlack}];

}

效能解说:

1:设置全局的导航栏和状态栏属性。 

2:如果当前不是导航控制器,则设置自身为导航根控制器。

Sagit 实现登入注册教导页

从WelcomleController中,现在跳到了StartController了:

表现的剧情如下图:(为不影响总体,那图宽高设的的相当的小,大伙可以新开窗口看大图):

图片 4

以此分界面,除了基础的布局,还有五个事件:

一:点立马登记:跳转到注册页。

二:点登陆:或跳转到登入页。

总体的功效如下:

图片 5

这里把View和Controller分开文件处理:

图片 6

探访StartView的布局的方方面面代码:(上面是小编自身简化后的代码,之前的代码多到吓死人)

#import "STView.h"

@interface StartView : STView  //StartView.h

@end


@implementation StartView    //StartView.m

- (void)initUI
{
  if(self.STController!=nil && self.STController.navigationController==nil){

      [self.STController asRoot:RootViewNavigationType];} 

    [self needNavigationBar:NO setNavBar:YES];//隐藏导航栏。

    [[[self addImageView:@"logo" imgName:@"login_logo"] width:170 height:170] relate:LeftTopRight v:290 v2:200 v3:290];

    UILabel *title = [[[self addLabel:nil text:@"IT恋" font:48] width:160 height:44] onBottom:@"logo" y:50];
    [[title textColor:@"#000000"] textAlignment:NSTextAlignmentCenter];

    UILabel *description = [[[[self addLabel:nil text:@"找优质靠谱IT男就上IT恋" font:36] width:450 height:34] onBottom:title y:48] toCenter:X];
    [[description textColor:@"#000000"] textAlignment:NSTextAlignmentCenter];

    //框架调整,下面这几行代码有变化,具体见下文补充:

    UIButton *regBtn = [[[[self addButton:@"Reg" title:@"立即注册"] width:287 height:77] onBottom:description y:484] toCenter:X];
    [[regBtn backgroundImage:@"login_btn"] keyValue:@{@"leftNavImage":@"nav_arrow_left_black"}];

    UIButton *loginBtn = [[[[self addButton:@"Login" title:@"已有账号,立即登录" font:24] width:300 height:26] onBottom:regBtn y:60] toCenter:X];
    [[loginBtn titleColor:MainHexColor] keyValue:STPreView.keyValue];
}


@end

新增添补内容:

新调换的两行代码的写法(新的调动是为着能够操纵导航栏的完整,包含标题及右侧的体制【原来只可以调节右侧】):

[[[[this addButton:@"Reg" title:@"立即注册"] width:287 height:77] onBottom:STPreView y:484] toCenter:X];
    [[STLastButton backgroundImage:@"login_btn"] key:STNavConfig value:@{STNavTitle:@"账号注册",STNavLeftImage:@"nav_arrow_left_black"}];

    [[[[this addButton:@"Login" title:@"已有账号,立即登录" font:24] width:300 height:26] onBottom:STPreView y:60] toCenter:X];
    [[STLastButton titleColor:MainHexColor] block:nil on:^(UIView *view) {
       [view key:STNavConfig value:@{STNavTitle:@"登录",STNavLeftImage:@"nav_arrow_left_black"}];
    }];

 

代码效用讲解(第二点和第二点上边再细讲):

1:基本上一个控件布局就一行代码,直接看过去就好了。

2:第一行设置不需要导航栏,并直接隐藏导航栏:[self needNavigationBar:NO setNavBar:YES];//隐藏导航栏

3:注册和登陆按钮,多了一个陌生的keyValue,因为这里要控制导航的返回按钮为自定义的图片。

再看看StartController中的全体代码:

@interface StartController : STController //StartController.h
@end

@implementation StartController //StartContrller.m

-(instancetype)init
{
    //初始化全局设置,必须要在UI初始之前。
    [self configNavAndStatusBar];
    return self;
}
-(void)configNavAndStatusBar
{

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];//白色底,所以状态字颜色改为黑

    //这里提前统一设定全局协议的内容(对于登陆、注册、找回密码三个窗体有效),进入Main之后,会重新修改全局协议的内容
    [[[[[[UINavigationBar globalSetting] barTintColor:ColorWhite]tintColor:ColorBlack] backgroundImage:nil] shadowImage:nil]
     titleTextAttributes:@{NSForegroundColorAttributeName:ColorBlack}];

}

功能疏解:

1:设置全局的导航栏和状态栏属性。 

2:如果当前不是导航控制器,则设置自身为导航根控制器。

Sagit 框架讲明:布局

对此框架的布局:

1:以【self addXXX】为起手势,一行代码实现一个UI的布局。

2:对于需要特定类型的控制属性的,用变量接收后,用无限连语法处理属性赋值。

3:相对父控件,用relate方法;相对同级,用:onTop、onLeft、onRight、onBottom方法,可以混着用,怎么简单怎么来。

布局的诀窍,都抽到了以下STUIViewAutoLayout文件中:

图片 7

看看基本的艺术重载:

#pragma mark [相对布局方法] RelativeLayout
-(UIView*)onRight:(id)uiOrName x:(CGFloat)x;
-(UIView*)onRight:(id)uiOrName x:(CGFloat)x y:(CGFloat)y;
-(UIView*)onLeft:(id)uiOrName x:(CGFloat)x;
-(UIView*)onLeft:(id)uiOrName x:(CGFloat)x y:(CGFloat)y;
-(UIView*)onTop:(id)uiOrName y:(CGFloat)y;
-(UIView*)onTop:(id)uiOrName y:(CGFloat)y x:(CGFloat)x;
-(UIView *)onBottom:(id)uiOrName y:(CGFloat)y;
-(UIView *)onBottom:(id)uiOrName y:(CGFloat)y x:(CGFloat)x;
-(UIView*)relate:(XYLocation)location v:(CGFloat)value;
-(UIView*)relate:(XYLocation)location v:(CGFloat)value v2:(CGFloat)value2;
-(UIView*)relate:(XYLocation)location v:(CGFloat)value v2:(CGFloat)value2 v3:(CGFloat)value3;
-(UIView*)relate:(XYLocation)location v:(CGFloat)value v2:(CGFloat)value2 v3:(CGFloat)value3 v4:(CGFloat)value4;
-(UIView*)toCenter;
-(UIView*)toCenter:(XYFlag)xyFlag;

以此很好明白的,基本读过去就知道了,轻巧易懂,其余的属性,等继续作品用到再说。

Sagit 框架疏解:布局

对于框架的布局:

1:以【self addXXX】为起手势,一行代码实现一个UI的布局。

2:对于需要特定类型的控制属性的,用变量接收后,用无限连语法处理属性赋值。

3:相对父控件,用relate方法;相对同级,用:onTop、onLeft、onRight、onBottom方法,可以混着用,怎么简单怎么来。

布局的措施,都抽到了以下STUIViewAutoLayout文件中:

图片 8

看望基本的格局重载:

#pragma mark [相对布局方法] RelativeLayout
-(UIView*)onRight:(id)uiOrName x:(CGFloat)x;
-(UIView*)onRight:(id)uiOrName x:(CGFloat)x y:(CGFloat)y;
-(UIView*)onLeft:(id)uiOrName x:(CGFloat)x;
-(UIView*)onLeft:(id)uiOrName x:(CGFloat)x y:(CGFloat)y;
-(UIView*)onTop:(id)uiOrName y:(CGFloat)y;
-(UIView*)onTop:(id)uiOrName y:(CGFloat)y x:(CGFloat)x;
-(UIView *)onBottom:(id)uiOrName y:(CGFloat)y;
-(UIView *)onBottom:(id)uiOrName y:(CGFloat)y x:(CGFloat)x;
-(UIView*)relate:(XYLocation)location v:(CGFloat)value;
-(UIView*)relate:(XYLocation)location v:(CGFloat)value v2:(CGFloat)value2;
-(UIView*)relate:(XYLocation)location v:(CGFloat)value v2:(CGFloat)value2 v3:(CGFloat)value3;
-(UIView*)relate:(XYLocation)location v:(CGFloat)value v2:(CGFloat)value2 v3:(CGFloat)value3 v4:(CGFloat)value4;
-(UIView*)toCenter;
-(UIView*)toCenter:(XYFlag)xyFlag;

本条很好了然的,基本读过去就领会了,轻便易懂,其余的习性,等再而三小说用到再说。

Sagit 框架疏解:事件

上一篇文章中,对事件有过一段解说:

框架对于UIView增加了二种点击事件的绑定形式:

#pragma mark 扩展系统事件
-(UIView*)click:(NSString*)event;
- (UIView*)addClick:(onClick)block;

click用于钦命一个事件的名号,addClick用于追加贰个事变试行的代码块。

也说了轩然大波的寻址流程:

1:先找传进来的event在所在的Controller中是否有对应的事件,若有,执行,若没有继续以下:

2:对event追加后缀变成eventClick和eventClick:再看有没有对应的事件,若有,执行,若没有继续以下:

3:对event追加后缀变成EventController,看有没有对应的控制器,若有,执行默认的open:事件跳转,若没有,则无绑定事件。

只是上边包车型地铁布局代码中并没利用click或addClick,同样是触发了这么些流程:

着力就在于UIButtton的name,假使3个按键有name,则寻觅事件,假设找到,就自行绑定事件。

据此,对于八个name,Reg和Login:一路找到最后会找到RegController和LoginController,触发STController中先期定义的open:事件。

Sagit 框架疏解:事件

上一篇小说中,对事件有过一段解说:

框架对于UIView扩充了二种点击事件的绑定方式:

#pragma mark 扩展系统事件
-(UIView*)click:(NSString*)event;
- (UIView*)addClick:(onClick)block;

click用于钦命3个轩然大波的称谓,addClick用于追加叁个事件施行的代码块。

也说了轩然大波的寻址流程:

1:先找传进来的event在所在的Controller中是否有对应的事件,若有,执行,若没有继续以下:

2:对event追加后缀变成eventClick和eventClick:再看有没有对应的事件,若有,执行,若没有继续以下:

3:对event追加后缀变成EventController,看有没有对应的控制器,若有,执行默认的open:事件跳转,若没有,则无绑定事件。

可是上边包车型地铁布局代码中并没动用click或addClick,同样是接触了这些流程:

基本就在于UIButtton的name,假如2个按键有name,则寻找事件,假若找到,就自行绑定事件。

所以,对于几个name,Reg和Login:一路找到最终会找到RegController和LoginController,触发STController中先期定义的open:事件。

Sagit 框架解说:keyValue属性和[UINavigationBar globalSetting]

Sagit 框架讲明:keyValue属性和[UINavigationBar globalSetting]

1:keyValue属性

IT恋那里有点尤其,跳转后须要转移导航栏的回到Logo,原来在Controller中写事件:

[self stPush:方法的第7个参数,内定一张图纸做为重返开关]

图片 9

唯独对于有代码洁P的本人,总想着怎么消灭掉这几个那些代码,固然七个事件就几行,但也不留。

本条参数怎么传到open:里啊?借使不是图形,是点名文字为回去的开关呢?

末尾想到三个相对健全的化解方案:

1:对UIView再扩大了二个keyValue的本性,于是有了:

keyValue已晋级:新的写法见上面的补给代码。

[[regBtn backgroundImage:@"login_btn"] keyValue:@{@"leftNavImage":@"nav_arrow_left_black"}];//这是旧代码,已过期不能用

二:open:事件中,再举行一下的简练推断拿值(那边也曾经调控过)。

图片 10

就像是此完美的缓解了。

新兴察觉这一个keyValue还有越多的用户场景,如:设置调节导航栏的显得或隐匿:

 [self needNavigationBar:NO setNavBar:YES];//隐藏导航栏。

在那之中其实正是对keyValue举行取值或赋值:

-(UIView*)needNavigationBar:(BOOL)yesNo setNavBar:(BOOL)setNavBar
{
    if(self.keyValue==nil)
    {
        self.keyValue=[NSMutableDictionary new];
    }
    [self.keyValue set:@"needNavigationBar" value:yesNo?@"1":@"0"];
    if(setNavBar && self.STController!=nil && self.STController.navigationController!=nil)
    {
        self.STController.navigationController.navigationBar.hidden=!yesNo;
    }
    return self;
}

现阶段框架是全自控导航栏的体现或隐蔽,不须求用户去再顾忌的在种种页面都以写代码了。

为了这一个导航栏,真花自身不少脑筋,越发是自定义重回和连串滑动重临,商量的进程都够其它再写①篇。

1:keyValue属性

IT恋那里有点新鲜,跳转后需求转移导航栏的回到Logo,原来在Controller中写事件:

[self stPush:方法的第多少个参数,钦定一张图片做为重临按键]

图片 11

然而对此有代码洁P的自家,总想着怎么消灭掉这几个那几个代码,即使七个事件就几行,但也不留。

以此参数怎么传到open:里啊?假使不是图形,是钦命文字为回去的按钮呢?

最终想到3个相对健全的化解方案:

一:对UIView再扩展了二个keyValue的品质,于是有了:

keyValue已升级:新的写法见上面包车型大巴填补代码。

[[regBtn backgroundImage:@"login_btn"] keyValue:@{@"leftNavImage":@"nav_arrow_left_black"}];//这是旧代码,已过期不能用

二:open:事件中,再拓展一下的轻便推断拿值(此地也早已调控过)。

图片 12

就像是此健全的缓解了。

新兴意识那么些keyValue还有越来越多的用户场景,如:设置调节导航栏的展现或隐蔽:

 [self needNavigationBar:NO setNavBar:YES];//隐藏导航栏。

中间其实正是对keyValue进行取值或赋值:

-(UIView*)needNavigationBar:(BOOL)yesNo setNavBar:(BOOL)setNavBar
{
    if(self.keyValue==nil)
    {
        self.keyValue=[NSMutableDictionary new];
    }
    [self.keyValue set:@"needNavigationBar" value:yesNo?@"1":@"0"];
    if(setNavBar && self.STController!=nil && self.STController.navigationController!=nil)
    {
        self.STController.navigationController.navigationBar.hidden=!yesNo;
    }
    return self;
}

脚下框架是电动调节导航栏的来得或潜伏,不须要用户去再想不开的在每一种页面都是写代码了。

为了这一个导航栏,真花笔者许三头脑,尤其是自定义重回和系统滑动重回,研究的进程都够别的再写一篇。

2:UINavigationBar globalSetting 的产生:

2:UINavigationBar globalSetting 的产生:

 A:对于这么些StartController那一个页面,有以下两种意况会跳转过来:

1:从欢迎引导页WelcomeController进来;

2:用户进行系统后,点击退出时从SystemController进来;

3:当前用户的Token数据失效,需要重新登陆时,从MainController中,跳进来;

不管从哪个地方过来,由于自家需求占根视图,而为导航调控器,所以有一行代码:

//从引导页跳转来时,需要将自身设置为导航根控制器
 if(self.STController.navigationController==nil){[self.STController asRoot:RootViewNavigationType];}

框架对UIViewCtroller扩大了:asRoot方法,能够将眼下Controller直接设置为根视图:

//将当前视图设置为根视图
-(UIViewController*)asRoot:(RootViewControllerType)rootViewControllerType{

    UIViewController *controller=self;
    if(rootViewControllerType==RootViewNavigationType)
    {
        controller = [[UINavigationController alloc]initWithRootViewController:self];
        //self.navigationController.navigationBar.hidden=!self.view.needNavigationBar;
    }
    [UIApplication sharedApplication].delegate.window.rootViewController=controller;
    return self;
}

B:导航栏实行联合的水彩风格处理(处理后,将对登记、登入、找回密码等生效):

事先的代码是这么的:

图片 13

框架封装完毕品质Infiniti连后方可如此:

[[[[[[UINavigationBar globalSetting] barTintColor:ColorWhite]tintColor:ColorBlack] backgroundImage:nil] shadowImage:nil]
     titleTextAttributes:@{NSForegroundColorAttributeName:ColorBlack}];

 A:对于那么些StartController那么些页面,有以下三种情状会跳转过来:

1:从欢迎引导页WelcomeController进来;

2:用户进行系统后,点击退出时从SystemController进来;

3:当前用户的Token数据失效,需要重新登陆时,从MainController中,跳进来;

任由从哪些地点过来,由于自己供给占根视图,而为导航调控器,所以有1行代码:

//从引导页跳转来时,需要将自身设置为导航根控制器
 if(self.STController.navigationController==nil){[self.STController asRoot:RootViewNavigationType];}

框架对UIViewCtroller扩充了:asRoot方法,能够将近期Controller直接设置为根视图:

//将当前视图设置为根视图
-(UIViewController*)asRoot:(RootViewControllerType)rootViewControllerType{

    UIViewController *controller=self;
    if(rootViewControllerType==RootViewNavigationType)
    {
        controller = [[UINavigationController alloc]initWithRootViewController:self];
        //self.navigationController.navigationBar.hidden=!self.view.needNavigationBar;
    }
    [UIApplication sharedApplication].delegate.window.rootViewController=controller;
    return self;
}

B:导航栏进行联合的水彩风格处理(处理后,将对注册、登录、找回密码等生效):

事先的代码是如此的:

图片 14

框架封装完结质量无限连后方可如此:

[[[[[[UINavigationBar globalSetting] barTintColor:ColorWhite]tintColor:ColorBlack] backgroundImage:nil] shadowImage:nil]
     titleTextAttributes:@{NSForegroundColorAttributeName:ColorBlack}];

那边有几点坑和大伙分享:

此间有几点坑和大伙儿分享:

坑A:怎么样进行品质Infiniti连

[UINavigationBar appearance]
那里重临的是协商接口,并不是UINavigationBar实例

一齐先看到UINavigationBar去接收appearance的特性,聪明如笔者,就去扩展UINavigationBar的属性方法,然后打算用Infiniti连简化。

结果一运营就死,进入坑里徘徊了多数日子,最后才察觉appearance重临的是UIAppearance接口,并不是UINavigationBar类型。

只是UIAppearnce又无法平昔用,也无法对协议接口做扩张,暂且蒙了下B。

然后绕到导航栏显示不展现、自定义重返和滑动重回,重临主分界面没主动往上顶等坑里。

坑里呆久出来后,想到另一种方法来贯彻Infiniti连:

由此叁个静态方法重临2个自定义类,再由那些自定义类来连代码,像那样:

@implementation UINavigationBar (ST)

+(UINavigationBarSetting*)globalSetting
{
    return [UINavigationBarSetting new];
}
@end

@implementation UINavigationBarSetting
#pragma mark 扩展系统属性
-(UINavigationBarSetting*)tintColor:(id)colorOrHex
{
    [UINavigationBar appearance].tintColor=[UIView toColor:(colorOrHex)];
    return self;
}
-(UINavigationBarSetting*)barTintColor:(id)colorOrHex
{
    [UINavigationBar appearance].barTintColor=[UIView toColor:(colorOrHex)];
    return self;
}

坑A:怎样进展质量Infiniti连

[UINavigationBar appearance]
那里重回的是探究接口,并不是UINavigationBar实例

1伊始阅览UINavigationBar去接收appearance的质量,聪明如作者,就去扩张UINavigationBar的性质方法,然后打算用Infiniti连简化。

结果一运维就死,进入坑里徘徊了累累小时,最终才意识appearance重回的是UIAppearance接口,并不是UINavigationBar类型。

可是UIAppearnce又不可能一贯用,也不能对协商接口做扩充,暂时蒙了下B。

下一场绕到导航栏呈现不显得、自定义重回和滑动重回,再次回到主分界面没主动往上顶等坑里。

坑里呆久出来后,想到另一种方式来落到实处Infiniti连:

透过2个静态方法重返2个自定义类,再由那个自定义类来连代码,像那样:

@implementation UINavigationBar (ST)

+(UINavigationBarSetting*)globalSetting
{
    return [UINavigationBarSetting new];
}
@end

@implementation UINavigationBarSetting
#pragma mark 扩展系统属性
-(UINavigationBarSetting*)tintColor:(id)colorOrHex
{
    [UINavigationBar appearance].tintColor=[UIView toColor:(colorOrHex)];
    return self;
}
-(UINavigationBarSetting*)barTintColor:(id)colorOrHex
{
    [UINavigationBar appearance].barTintColor=[UIView toColor:(colorOrHex)];
    return self;
}

坑B:为什么全局设置无效

先前的代码,先实行ViewDidLoad里的大局设置,再实施asRoot,触发导航栏,这样是常规的:

-(void)viewWillAppear:(BOOL)animated
{
    if(self.navigationController==nil)
    {
        [self asRoot:RootViewNavigationType];
        //self.navigationController.navigationBar.hidden = YES;
    }
}

而是那段代码被小编消灭了,此外地点的跳转代码都以直接,退出后转跳:

图片 15

改完后,发现全局失效了,最终坑里呆了壹圈才发现:

全局的安装,必须在导航栏UI出现从前设置才使得,所以,假使这么写代码:

大局设置就不可能写在ViewDidLoad里了,必须写在init中了。

坑B:为什么全局设置无效

原先的代码,先实行ViewDidLoad里的大局设置,再施行asRoot,触发导航栏,这样是符合规律的:

-(void)viewWillAppear:(BOOL)animated
{
    if(self.navigationController==nil)
    {
        [self asRoot:RootViewNavigationType];
        //self.navigationController.navigationBar.hidden = YES;
    }
}

不过那段代码被作者消灭了,其余地点的跳转代码都以直接,退出后转跳:

图片 16

改完后,发现全局失效了,最后坑里呆了1圈才察觉:

全局的装置,必须在导航栏UI出现在此之前设置才使得,所以,假使如此写代码:

大局设置就不可能写在ViewDidLoad里了,必须写在init中了。

总结:

壹:用框架写代码很轻巧,也很轻松。

二:框架近来的代码不多,早看早了结。

叁:随着应用场景的扩张,框架会持续的提升,预味着开采仍是很简短,但要通晓原理就须求花越来越多时光。

4:即使教程是以IT恋为教学,但要么愿意大伙多关怀IT连,哈。

总结:

一:用框架写代码很轻巧,也很简单。

2:框架最近的代码不多,早看早了结。

三:随着应用场景的扩充,框架会不停的增高,预味着开荒仍是不会细小略,但要通晓原理就须要花更加多时间。

四:尽管教程是以IT恋为教师,但要么愿意大伙多关怀IT连,哈。

相关文章