Start引导页及框架布局和隐藏事件的内幕

2019-10-08 13:51 来源:未知

这边有几点坑和公众分享:

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

初始的代码,先实行ViewDidLoad里的全局设置,再举行asRoot,触发导航栏,那样是健康的:

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

可是这段代码被本人消灭了,另外地点的跳转代码都以直接,退出后转跳:

图片 1

改完后,发掘全局失效了,最终坑里呆了一圈才发觉:

全局的安装,必得在导航栏UI出现在此以前安装才有效,所以,要是那样写代码:

大局设置就无法写在ViewDidLoad里了,必得写在init中了。

坑A:如何开展质量Infiniti连

[UINavigationBar appearance] 这里重返的是说道接口,并非UINavigationBar实例

一初步观察UINavigationBar去接收appearance的天性,聪明如小编,就去扩大UINavigationBar的属性方法,然后计划用无限连简化。

结果一运营就死,步入坑里徘徊了过多时日,最终才发觉appearance再次回到的是UIAppearance接口,而不是UINavigationBar类型。

不过UIAppearnce又不能够直接用,也无法对合同接口做扩大,有时蒙了下B。

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

坑里呆久出来后,想到另一种艺术来完毕Infiniti连:

因而五个静态方法重临一个自定义类,再由这么些自定义类来连代码,像这样:

@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;
}

1:keyValue属性

IT恋这里有一点点特殊,跳转后要求退换导航栏的回来Logo,原来在Controller中写事件:

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

图片 2

可是对此有代码洁P的本人,总想着怎么消灭掉这几个这几个代码,固然五个事件就几行,但也不留。

其一参数怎么传到open:里吧?假若不是图形,是钦定文字为回去的开关呢?

提起底想到多个绝对健全的应用方案:

1:对UIView再推而广之了八个keyValue的性情,于是有了:

keyValue已升任:新的写法见上边的补偿代码。

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

2:open:事件中,再扩充一下的轻便判别拿值(此处也一度调治过)。

图片 3

就那样健全的消除了。

后来发觉这一个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;
}

当下框架是自动调控导航栏的突显或潜伏,无需顾客去再顾虑的在每一个页面都以写代码了。

为了这么些导航栏,真花自个儿不菲头脑,极度是自定义重返和系统滑动重回,研讨的历程都够另外再写一篇。

前言:

框架依然在便捷更新着:在重构、简化代码,统一标准的经过中。

高级中学级也蒙受种种坑,然而万幸一步一鞋印的消除了。

虽说还有些功效还在揣摩,不过教程,照旧得补上:

上篇作品:Sagit.Framework For IOS 开采框架入门开辟教程2:一行代码完结因人而异页

在这之中讲到,携带完后,依照是或不是留存的Token来消除跳转到StartController照旧MainController。

那篇就写写StartController,达成的代码虽少,但原理绝对美丽观!!!

总结:

1:用框架写代码极粗略,也很简短。

2:框架近来的代码没有多少,早看早了结。

3:随着应用场景的增多,框架会不停的进步,预味着开拓仍是一点也不细略,但要通晓原理就必要花更多日子。

4:纵然教程是以IT恋为教师,但要么愿意大家多关心IT连,哈。

2:UINavigationBar globalSetting 的产生:

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,若是三个按键有name,则寻觅事件,假使找到,就自动绑定事件。

为此,对于七个name,Reg和Login:一路找到最终会找到RegController和LoginController,触发STController中优先定义的open:事件。

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

Sagit 完成登录注册辅导页

从WelcomleController中,今后跳到了StartController了:

表现的剧情如下图:(为不影响全部,那图宽高设的的非常小,大伙能够新开窗口看大图):

图片 4

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

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

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

总体的成效如下:

图片 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:如果当前不是导航控制器,则设置自身为导航根控制器。

 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:导航栏实行统一的颜色风格管理(管理后,将对登记、登录、找回密码等生效):

前边的代码是那样的:

图片 7

框架封装完毕质量Infiniti连后得以如此:

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

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;

以此很好通晓的,基本读过去就驾驭了,轻便易懂,其余的个性,等持续著成效到再说。

TAG标签:
版权声明:本文由银河国际点击登录发布于升级网络游戏,转载请注明出处:Start引导页及框架布局和隐藏事件的内幕