3G Share仿写总结文章目录3G Share仿写总结登录页首页搜索页文章页活动页个人信息页登录页这里其实就是一个登录注册视图转换进行密码验证就好其中的一个重点在于键盘弹出整个页面上移这里我用的是系统键盘弹出的通知比如UIKeyboardWillShowNotificationUIKeyboardDidShowNotification等等这些通知携带的useInfo会有键盘动画前后的frame动画时长等所以我们可以直接根据通知携带的useInfo完成上移-(void)keyboardWillShow:(NSNotification*)notification{CGRect keyboardFrame[notification.userInfo[UIKeyboardFrameEndUserInfoKey]CGRectValue];CGFloat keyboardHeightkeyboardFrame.size.height;CGFloat duration[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey]doubleValue];[UIView animateWithDuration:duration animations:^{self.view.transformCGAffineTransformMakeTranslation(0,-keyboardHeight/2);}];}⚠️由于登录和注册页都要使用这个通知所以这里需要注意的是这里的通知需要注册到viewWillAppear以及在viewWillDisappear:移除监听因为注册在viewDidLoad会有问题会导致如果从注册页返回时键盘收起 的通知还会同时触发LoginVC的keyboardWillHide导致LoginVC的view执行了一次CGAffineTransformIdentity复位但是此时的但 LoginVC 的 view 此时不一定是偏移状态就会多次移位导致奇怪的下降或上移所以我们要在页面出现时再注册监听同时页面消失的时候复位并移除监听而且由于当前LoginVC上移键盘透明会显示出下层window视图的背景颜色所以还需要给window层设置一下背景颜色首页这一页主要就是一个tableView和轮播图以及一个点赞传值的功能轮播图的内容我在NStimer中讲过这里就不再介绍点赞传值我其实就是把整个share的所有有关文章显示的内容做了一个单例然后通过通知传值在某一处被点赞后修改model值并通知其他地方刷新点赞状态 ⚠️注意这里的点赞通知不能像注册页注册在viewWillAppear这样会导致离开该页面就移除监 听这样也就听不到其他界面的点赞通知只能在每次viewWillAppear再进行一次页面刷新viewDidLoad只会调用 一次所以model被改变要刷新所以最好把通知注册到viewDidLoad并在dealloc中移除监听最后一个就是假日页图片展示的部分这里我用约束链打算让图片自己的高度撑起cell的高度但是由于在自定义cellinit的时候无法将图片model传入只能在后续update的时候传入图片数据所以在init写UIImageView约束的时候不知道图片高度cell和图片互相依赖约束系统无法进行计算所以必须在update传入图片的时候根据图片真实比例更新高度约束你可能会像在有一些文本撑起cell高度的时候就没有这个问题是因为高度是由“内容 font”自动 决定的(Intrinsic Content Size)// HolidayPhotoCell.m-(void)updateWithModel:(NSArray*)model index:(NSInteger)index{UIImage*image[UIImage imageNamed:model[index]];self.imaV.imageimage;if(image){CGFloat ratioimage.size.height/image.size.width;CGFloat screenWidth[UIScreen mainScreen].bounds.size.width;CGFloat imageHeightscreenWidth*ratio;[self.imaV mas_updateConstraints:^(MASConstraintMaker*make){make.height.mas_equalTo(imageHeight);}];}}搜索页这一页主要就是原本的标签页大白页和上传页标签页我采用的是UICollectionView再写一个self.collection.allowsMultipleSelection YES;允许多选就行大白页根据UITextFieldDelegate代理方法进行视图转换上传页的图片选择器我在上一篇PHPickerViewController笔记中有讲到这里就不再赘述上传页的“原创作品”展开选项原理类似于折叠cell我这里是一个text为原创作品image为chevron.down的button以及一个展示选项的tableView这个tableView在最初没有点击展开的时候它的约束高度为0make.height.mas_equalTo(0);并将这个约束进行保存在button被点击之后更新tableView的高度并且做一个chevron.down箭头图标旋转的动画就会有展开的感觉收起也是同理注意这里在每次展开后要设置[self.view bringSubviewToFront:self.dropList];将选项列表 展示在最上层防止被其他控件挡住文章页这里我写的是支持横向滚动的ScrollView里装三个TableView这里需要注意的就是要开启UIScrollView的方向锁定self.scr.directionalLockEnabled YES;也就是用户开始滑动的时候系统会根据一开始的滑动方向尽量锁定成横向滑动或者纵向滑动不然的话你的ScrollView可能就会有能斜着滑动的问题再就是UIScrollView的滑动和UISegmentedControl尽量同步也就是说不要在滑动视图结束滚动的协议方法里修改UISegmentedControl的索引位置这样会看起来很突然的移动在实时滚动的协议方法里进行页吗判断-(void)scrollViewDidScroll:(UIScrollView*)scrollView{// 因为tableView也继承于UIScrollView// 所以 tableView 滚动也会触发 scrollViewDidScroll:就会导致竖直滑动tableView的时候segmentControl也会移动// 只处理横向翻页的 scr忽略 tableView 的滚动if(scrollView!self.scr)return;CGFloat pageWidthscrollView.bounds.size.width;CGFloat offsetscrollView.contentOffset.x;CGFloat realPageoffset/pageWidth;NSInteger index(NSInteger)(realPage0.5);indexMAX(0,MIN(index,2));self.titleSeg.selectedSegmentIndexindex;}活动页这里就是一个简单的UITableView个人信息页这里的难点主要集中在私信发送我这里是用UITableView做了两个自定义cell分别用在左边对方发送气泡和右边我的发送气泡然后每次点击发送按钮后将textField.text保存到model里之后在tableView中插入新的一行[self.tableView insertRowsAtIndexPaths:[indexPath] withRowAnimation:UITableViewRowAnimationBottom];并且滚动tableView让新消息始终在键盘/屏幕上方[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];注意这里UITableViewScrollPositionBottom的底部是相对于tableView的所以最好该页面用约束链将tableView和发送部分连在一起这样在键盘弹起底部发送部分同步弹起的时候可以将tableView的底部也抬起这个model里有枚举值用来代表是我还是对方发送的消息根据这个判断cell复用的时候用的是哪个气泡这个自定义消息气泡的cell要注意用约束链根据文字内容高度撑开cell高度这样在用户输入多行文字的时候能够自然的撑起气泡的高度typedefNS_ENUM(NSInteger,MessageType){MessageTypeSelf,MessageTypeOther};interfaceChatModel:NSObjectproperty(nonatomic,copy)NSString*content;property(nonatomic,copy)NSString*avatar;property(nonatomic,assign)MessageType type;(instancetype)modelWithContent:(NSString*)content type:(MessageType)type avatar:(NSString*)avatar;end这里在第二次进入视图还能够保存之前的数据是我这里把所有model做成一份单例这样在第二次打开视图的时候就不会初始化覆盖掉以及我做了一个block传值是的私信列表展示聊天记录的最后一句话
iOS - 3G share仿写总结
发布时间:2026/6/3 16:12:43
3G Share仿写总结文章目录3G Share仿写总结登录页首页搜索页文章页活动页个人信息页登录页这里其实就是一个登录注册视图转换进行密码验证就好其中的一个重点在于键盘弹出整个页面上移这里我用的是系统键盘弹出的通知比如UIKeyboardWillShowNotificationUIKeyboardDidShowNotification等等这些通知携带的useInfo会有键盘动画前后的frame动画时长等所以我们可以直接根据通知携带的useInfo完成上移-(void)keyboardWillShow:(NSNotification*)notification{CGRect keyboardFrame[notification.userInfo[UIKeyboardFrameEndUserInfoKey]CGRectValue];CGFloat keyboardHeightkeyboardFrame.size.height;CGFloat duration[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey]doubleValue];[UIView animateWithDuration:duration animations:^{self.view.transformCGAffineTransformMakeTranslation(0,-keyboardHeight/2);}];}⚠️由于登录和注册页都要使用这个通知所以这里需要注意的是这里的通知需要注册到viewWillAppear以及在viewWillDisappear:移除监听因为注册在viewDidLoad会有问题会导致如果从注册页返回时键盘收起 的通知还会同时触发LoginVC的keyboardWillHide导致LoginVC的view执行了一次CGAffineTransformIdentity复位但是此时的但 LoginVC 的 view 此时不一定是偏移状态就会多次移位导致奇怪的下降或上移所以我们要在页面出现时再注册监听同时页面消失的时候复位并移除监听而且由于当前LoginVC上移键盘透明会显示出下层window视图的背景颜色所以还需要给window层设置一下背景颜色首页这一页主要就是一个tableView和轮播图以及一个点赞传值的功能轮播图的内容我在NStimer中讲过这里就不再介绍点赞传值我其实就是把整个share的所有有关文章显示的内容做了一个单例然后通过通知传值在某一处被点赞后修改model值并通知其他地方刷新点赞状态 ⚠️注意这里的点赞通知不能像注册页注册在viewWillAppear这样会导致离开该页面就移除监 听这样也就听不到其他界面的点赞通知只能在每次viewWillAppear再进行一次页面刷新viewDidLoad只会调用 一次所以model被改变要刷新所以最好把通知注册到viewDidLoad并在dealloc中移除监听最后一个就是假日页图片展示的部分这里我用约束链打算让图片自己的高度撑起cell的高度但是由于在自定义cellinit的时候无法将图片model传入只能在后续update的时候传入图片数据所以在init写UIImageView约束的时候不知道图片高度cell和图片互相依赖约束系统无法进行计算所以必须在update传入图片的时候根据图片真实比例更新高度约束你可能会像在有一些文本撑起cell高度的时候就没有这个问题是因为高度是由“内容 font”自动 决定的(Intrinsic Content Size)// HolidayPhotoCell.m-(void)updateWithModel:(NSArray*)model index:(NSInteger)index{UIImage*image[UIImage imageNamed:model[index]];self.imaV.imageimage;if(image){CGFloat ratioimage.size.height/image.size.width;CGFloat screenWidth[UIScreen mainScreen].bounds.size.width;CGFloat imageHeightscreenWidth*ratio;[self.imaV mas_updateConstraints:^(MASConstraintMaker*make){make.height.mas_equalTo(imageHeight);}];}}搜索页这一页主要就是原本的标签页大白页和上传页标签页我采用的是UICollectionView再写一个self.collection.allowsMultipleSelection YES;允许多选就行大白页根据UITextFieldDelegate代理方法进行视图转换上传页的图片选择器我在上一篇PHPickerViewController笔记中有讲到这里就不再赘述上传页的“原创作品”展开选项原理类似于折叠cell我这里是一个text为原创作品image为chevron.down的button以及一个展示选项的tableView这个tableView在最初没有点击展开的时候它的约束高度为0make.height.mas_equalTo(0);并将这个约束进行保存在button被点击之后更新tableView的高度并且做一个chevron.down箭头图标旋转的动画就会有展开的感觉收起也是同理注意这里在每次展开后要设置[self.view bringSubviewToFront:self.dropList];将选项列表 展示在最上层防止被其他控件挡住文章页这里我写的是支持横向滚动的ScrollView里装三个TableView这里需要注意的就是要开启UIScrollView的方向锁定self.scr.directionalLockEnabled YES;也就是用户开始滑动的时候系统会根据一开始的滑动方向尽量锁定成横向滑动或者纵向滑动不然的话你的ScrollView可能就会有能斜着滑动的问题再就是UIScrollView的滑动和UISegmentedControl尽量同步也就是说不要在滑动视图结束滚动的协议方法里修改UISegmentedControl的索引位置这样会看起来很突然的移动在实时滚动的协议方法里进行页吗判断-(void)scrollViewDidScroll:(UIScrollView*)scrollView{// 因为tableView也继承于UIScrollView// 所以 tableView 滚动也会触发 scrollViewDidScroll:就会导致竖直滑动tableView的时候segmentControl也会移动// 只处理横向翻页的 scr忽略 tableView 的滚动if(scrollView!self.scr)return;CGFloat pageWidthscrollView.bounds.size.width;CGFloat offsetscrollView.contentOffset.x;CGFloat realPageoffset/pageWidth;NSInteger index(NSInteger)(realPage0.5);indexMAX(0,MIN(index,2));self.titleSeg.selectedSegmentIndexindex;}活动页这里就是一个简单的UITableView个人信息页这里的难点主要集中在私信发送我这里是用UITableView做了两个自定义cell分别用在左边对方发送气泡和右边我的发送气泡然后每次点击发送按钮后将textField.text保存到model里之后在tableView中插入新的一行[self.tableView insertRowsAtIndexPaths:[indexPath] withRowAnimation:UITableViewRowAnimationBottom];并且滚动tableView让新消息始终在键盘/屏幕上方[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];注意这里UITableViewScrollPositionBottom的底部是相对于tableView的所以最好该页面用约束链将tableView和发送部分连在一起这样在键盘弹起底部发送部分同步弹起的时候可以将tableView的底部也抬起这个model里有枚举值用来代表是我还是对方发送的消息根据这个判断cell复用的时候用的是哪个气泡这个自定义消息气泡的cell要注意用约束链根据文字内容高度撑开cell高度这样在用户输入多行文字的时候能够自然的撑起气泡的高度typedefNS_ENUM(NSInteger,MessageType){MessageTypeSelf,MessageTypeOther};interfaceChatModel:NSObjectproperty(nonatomic,copy)NSString*content;property(nonatomic,copy)NSString*avatar;property(nonatomic,assign)MessageType type;(instancetype)modelWithContent:(NSString*)content type:(MessageType)type avatar:(NSString*)avatar;end这里在第二次进入视图还能够保存之前的数据是我这里把所有model做成一份单例这样在第二次打开视图的时候就不会初始化覆盖掉以及我做了一个block传值是的私信列表展示聊天记录的最后一句话