3Gshare总结
在这周完成了3Gshare的demo,3Gshare的难度和代码量都和仿写网易云相比有了很大的提升,在这个过程中遇到了很多问题和bug,在解决问题的过程中也学到了很多。
1.启动页
首先启动页写法和网易云时启动页写法相同,设定定时器对界面进行计时,即使结束后跳转到下一界面,具体写法可以参考网易云博客。
2.登录注册
在进入app主界面之前,先要进行注册账号和登录账号,在这里运用到了协议传值,将注册好的账号和密码通过数组或者字典传回登陆界面,在这块我刚开始用的是两个字符串进行传值,这样传值的话就只能注册一次,但是按照要求,如果我连续注册两次,那么应该两次的账号和密码都可以完成登录,而且注册界面必须要有一个判断,如果我两次注册的账号相同,应该给出警告。
//注册完成
- (void)presszhuce {
int boo = 0;
for (int i = 0; i < _zhanghaoarray.count; i++) {
if ([_zhanghaoarray[i] isEqualToString:_secondTextField.text]) {
boo = 1;
break;
}
}
if (boo == 1) {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"警告" message:@"账号已经注册过" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *sure = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:sure];
[self presentViewController:alertController animated:YES completion:nil];
} else {
[_zhanghaoarray addObject:_secondTextField.text];
[_mimaarray addObject:_thirdTextField.text];
[_delegate zhuce:_zhanghaoarray:_mimaarray];
[self dismissViewControllerAnimated:YES completion:nil];
}
_firstTextField.text = nil;
_secondTextField.text = nil;
_thirdTextField.text = nil;
}
关于协议传值可以看上一节博客:
iOS——协议传值和属性传值
3.导航栏上侧白条
在写网易云的时候,因为导航栏都是白色的,所以不会遇到该问题,3Gshare的导航栏要求是蓝色,如果通过导航栏的barTintColor和backgroundColor对导航栏颜色进行赋值,导航栏的上方还会有一行白条,如图:
对于这种情况有以下解决方案:
UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
[appearance configureWithOpaqueBackground];
//newblue为自己设定的颜色
appearance.backgroundColor = newblue;
appearance.shadowColor = [UIColor clearColor];
FirstNavigationController.navigationBar.standardAppearance = appearance;
FirstNavigationController.navigationBar.scrollEdgeAppearance = FirstNavigationController.navigationBar.standardAppearance;
4.自动滚动视图
在刚开始给滚动视图加定时器的时候,如果在自动轮播的过程中对其进行拖拽的话,定时器就会出现错乱,因此要在滚动视图开始拖拽时令其定时器停止,在滚动视图停止拖拽时,重新启动:
//滚动视图开始拖拽
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
if (scrollView.tag == 1) {
[_timer invalidate];
_timer = nil;
}
}
//滚动视图停止拖拽
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
if (scrollView.tag == 1) {
_timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(timeOut:) userInfo:nil repeats:YES];
}
}
除此之外,可以看到在令定时器开始和停止的时候,首先判断了滚动视图的tag值,因为在滚动视图这一页,有一个tableView,tableView是滚动视图的子类,如果不对两个滚动视图的tag进行赋值,在对tableView进行拖拽时,可能也会对定时器有所影响,可能会造成滚动视图错乱。
还有一个非常重要的一点,在给自定义cell里的滚动视图添加图片时,我把添加图片的代码放在了:
- (void)layoutSubviews;
这个函数里,在这个函数里对图片进行了初始化然后添加,这种情况当滚动视图轮播时就会造成如下问题:
这个与layoutSubviews函数机制有关,会把图片初始化好多遍,由此要明白一点,在自定义cell时,对cell里元素的初始化最好放在:
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
这个函数里,如果要放在layoutSubviews函数里,一定要给他添加上判断条件,令其只初始化一次。
5.折叠cell
在发布图片界面有一个折叠cell,折叠cell就要求通过按钮的点击,让tableView的大小发生改变,并且让cell里的元素顺序也要发生改变。
对于这样的要求,我们对左侧的button的tag赋值,如果按钮按下,就改变其tag值,然后对按钮的tag值判断,从而在tableView的方法里对其修改属性:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (_cellbutton.tag == 1) {
return 1;
} else {
return 4;
}
}
还要注意一点,对cell里面的text赋值时,用一个可变数组赋值,在点击cell改变cell里文字时,对可变数组的顺序也要改变,将选中的cell的text放在第一个。
6.上传图片
在这里用到了协议传值,在选择图片界面,选择好要发布的图片,将选择好的图片的数量和最后一张图片的名称传回上一界面,此时将图片和图片的数量展示在相应位置。