项目小结
![](https://img.haomeiwen.com/i3113715/f72cb661b781c662.png)
Launch Screen
的优先级 大于Launch Images
, 但是 Launch Screen 只有一张图片,在不同的屏幕中可能会拉升。
Launch Images 可以根据不同的屏幕让设计做不同尺寸的启动图。
启动图片由Launch Images设置启动图,那么屏幕的
可视范围
由启动图决定->所以需要各种尺寸的启动图
![](https://img.haomeiwen.com/i3113715/e867dcf1c913bfe7.png)
LaunchScreen 的好处1、自动识别当前真机或者模拟器尺寸 2、需要让美工提供一张可拉伸的图片 3、可以展示更多的控件
LaunchScreen 是对模拟器的截屏,生成一张图片作为启动图片
设置UITabBarItem 相关
![](https://img.haomeiwen.com/i3113715/be1668ecab7540a4.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)];
}
网友评论