2018-12-17

作者: Persistent丧心病狂 | 来源:发表于2018-12-17 01:00 被阅读2次

项目小结

image.png

Launch Screen 的优先级 大于 Launch Images, 但是 Launch Screen 只有一张图片,在不同的屏幕中可能会拉升。

Launch Images 可以根据不同的屏幕让设计做不同尺寸的启动图。

启动图片由Launch Images设置启动图,那么屏幕的可视范围由启动图决定->所以需要各种尺寸的启动图

image.png

LaunchScreen 的好处1、自动识别当前真机或者模拟器尺寸 2、需要让美工提供一张可拉伸的图片 3、可以展示更多的控件
LaunchScreen 是对模拟器的截屏,生成一张图片作为启动图片

设置UITabBarItem 相关

image.png
//只调用一次
+ (void)load{
    //获取UITabbarItem
    //社会babbar 选中颜色
    /*
     appearance
     1、只要遵守了UIAppearance 协议,还要实现这个方法 UI_APPEARANCE_SELECTOR
     */
    UITabBarItem *item = [UITabBarItem appearance];
    //设置 btabbarItem  字体颜色  后面的state:UIControlStateSelected 可随便设置
    [item setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor blackColor]} forState:UIControlStateSelected];

    //设置`字体`,只有 UIControlStateNormal(正常)  状态下才会有效果
    [item setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12.0f]} forState:UIControlStateNormal];
}

边缘滑动返回

边缘滑动返回功能 要在基类的导航控制器的viewDidLoad 中加上下面的代码
然后需要加上下面的代理方法()

 self.interactivePopGestureRecognizer.delegate = self;
/** 决定是否触发手势*/
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    
    //非根控制器可以滑动
    return self.childViewControllers.count >1;
}

全屏滑动返回

全屏滑动返回功能 要在基类的导航控制器的viewDidLoad 中加上下面的代码
然后需要加上下面的代理方法
这个方法就是在导航控制器的view中加上一个滑动的手势,这个手势调用的方法就是系统的滑动返回的方法

//  以下是全屏幕滑动
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
    [self.view addGestureRecognizer:pan];
    pan.delegate = self;
    //禁止之前的边缘手势
    self.interactivePopGestureRecognizer.enabled = NO;
/** 决定是否触发手势*/
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    
    //非根控制器可以滑动
    return self.childViewControllers.count >1;
}
//从xib加载会调用一次
- (void)awakeFromNib {
    [super awakeFromNib];
    //在xib中设置头像的圆角位置 awakeFromNib
    _image.layer.cornerRadius = 30;
    _image.layer.masksToBounds = YES;
}
static NSString * const identifier = @"LCSubTagViewController";

//如果是通过注册的cell,就不用绑定identifier了
    [self.tableView registerNib:[UINib nibWithNibName:@"LCSubBagCell" bundle:nil] forCellReuseIdentifier:identifier];
  • tableview 底层实现

1、首先把所有cell 的位置全部计算好,保存
2、当cell要现实的时候,就会拿到这个cell设置frame
cell.frame = self.frame[row];

设置控件的frame时候尽量在 viewDidLayoutSubviews

- (IBAction)clickRegister:(UIButton *)sender {

    sender.selected = !sender.selected;
    
     self.middleLeading.constant  =self.middleLeading.constant == 0?-kScreenWidth:0;
    [UIView animateWithDuration:0.3 animations:^{
        [self.view layoutIfNeeded];
    }];
}


- (void)viewDidLoad {
    [super viewDidLoad];
    LCLoginRegister *loginV = [LCLoginRegister loginView];
    [self.middleView addSubview:loginV];

    LCLoginRegister *registerV = [LCLoginRegister registerView];
    [self.middleView addSubview:registerV];


}



- (void)viewDidLayoutSubviews{
    
    [super viewDidLayoutSubviews];
    
    LCLoginRegister *loginV = self.middleView.subviews[0];
    loginV.frame = CGRectMake(0, 0, self.middleView.bounds.size.width * 0.5, self.middleView.bounds.size.height);

    LCLoginRegister *registerV = self.middleView.subviews[1];
    registerV.frame = CGRectMake(self.middleView.bounds.size.width * 0.5, 0, self.middleView.bounds.size.width * 0.5, self.middleView.bounds.size.height);
    
}

控件的约束改变之后想要立刻生效就调用

 //设置了约束之后,马上开始改变位置
        [self.view layoutIfNeeded];
//处理cell的间距,默认tableView分组样式,有额外头部和尾部间距,以下设置更合理一些
    self.tableView.sectionHeaderHeight = 0;
    self.tableView.sectionFooterHeight = 10;
    
    //分组样式第一个cell的y中从35开始,为了上下一致,需要这样设置
    self.tableView.contentInset = UIEdgeInsetsMake(-25, 0, 0, 0);

退出时候可能还有网络在请求中,可以在viewWillDisappear中停掉

-(void)viewWillDisappear:(BOOL)animated{
    
    [super viewWillDisappear:animated];
    
    //取消loding
    [SVProgressHUD dismiss];
    
    //取消网络请求
//    [self.manager.tasks enumerateObjectsUsingBlock:^(NSURLSessionTask * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
//        [obj cancel];
//    }];
    [self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
    
}

相关文章

网友评论

    本文标题:2018-12-17

    本文链接:https://www.haomeiwen.com/subject/odbfkqtx.html