使用“LemonBubble”进行弹窗提示的显示
主要使用到了2种显示方法:
LKRightBubble(title, time);//正确显示框
LKErrorBubble(title, time);//错误显示框
效果如下:
显示时会有一段简单的动画,调用时也非常的方便。
使用“AVOSCloud”对数据进行云端的存储,充当后端数据库的作用
主要使用到了如下两张表:
表名:_User | 用于储存用户的信息的表 |
---|---|
objectId | 每个用户内部的唯一标识,不可更改 |
username | 用户名(登录时使用,可以更改) |
password | 用户密码 |
sex | 用户性别 |
birthday | 生日 |
address | 地址 |
qianming | 个性签名 |
headImg | AVFile,为用户的头像 |
表名:feedInfo | 用于储存每个发表的帖子的表 |
---|---|
objectId | 每个帖子的唯一标识 |
userId | 发表该帖子的用户id |
pics | 该帖子里的图片信息,每张图片为一个AVFile |
likeUsers | 点赞的用户id列表 |
comments | 评论列表,包括每个评论者的id与评论内容 |
likeNum | 点赞数量 |
commentNum | 评论数量 |
其中AVFile为储存文件的专门的数据库,下面给出例子说明其调用方法:
AVUser *user=[AVUser currentUser];//得到当前用户
//获取头像
AVQuery *query2=[AVQuery queryWithClassName:@"_User"];//查询用户表
[query2 whereKey:@"objectId" equalTo:user.objectId];//根据当前用户id查询
[query2 includeKey:@"headImg"];
NSArray *a=[query2 findObjects];//得到查询到的数组
AVObject *avobj=a[0];//由于id是唯一标识,所以只会查找到一个
AVFile *file=avobj[@"headImg"][0];//用户头像只有一张
[file downloadWithProgress:^(NSInteger number) {
// 下载的进度数据,number 介于 0 和 100
} completionHandler:^(NSURL * _Nullable filePath, NSError * _Nullable error) {
// filePath 是文件下载到本地的地址
NSString* urlStr = [filePath absoluteString];//得到下载到本地的缓存路径
NSString* cutpath=[urlStr substringWithRange:NSMakeRange(7, urlStr.length-7)];
UIImage *img=[[UIImage alloc] initWithContentsOfFile:cutpath];//拿到图片
self->_head_image.image=img;//设置用户头像
}];
使用“XRCarouselView”展示帖子的图片
在主页的每个帖子的图片显示中使用到了,通过设置其frame大小与展示内容,就可以直接使用。多张图片自带滚动效果,并且可以自定义设置点击图片事件。
XRCarouselView *showview=[[XRCarouselView alloc]initWithFrame:CGRectMake(0, height+top_interval, screen_wid, infoPic_height)];//初始化组件
[showview setImageArray:array];//添加显示图片
showview.imageClickBlock = ^(NSInteger index) {
//图片的点击事件
[self openPics:index];
};
使用“MWPhotoBrowser”实现图片的点击事件
在图片流以及主页界面,点击图片后会跳转至图片的详情界面。
-(void)openPicWindow:(int)currentnum pics:(NSArray*)pics{
MWPhotoBrowser *browser = [[MWPhotoBrowser alloc] initWithDelegate:self];
[browser setCurrentPhotoIndex:currentnum];//设置当前阅读的图片
_picsArr=pics;
[self.navigationController pushViewController:browser animated:YES];
}
使用它的原因是其也可以实现多张图片的滚动,操作起来非常的方便。
使用“MJRefresh”实现下拉刷新与上拉加载
在代码中添加
然后分别设置触发事件,简洁方便。在主页的刷新与发现页面的加载中使用到了。
动画的使用
在点击主页点赞按钮时有一个简单的放大缩小动画
代码实现如下:
CGRect origin=_like.frame;
[UIView animateWithDuration:0.25 animations:^{//添加动画
//设置点赞按钮最大时的显示位置与图片
[self->_like setImage:[self image:[UIImage imageNamed:@"xihuan_red.png"] byScalingToSize:CGSizeMake(icon_wid+10, icon_wid+10)] forState:UIControlStateNormal];
[self->_like setFrame:CGRectMake(origin.origin.x-5, origin.origin.y-5, origin.size.width+10, origin.size.height+10)];
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.25 animations:^{
//从最大还原为最初大小
[self->_like setImage:[self image:[UIImage imageNamed:@"xihuan_red.png"] byScalingToSize:CGSizeMake(icon_wid, icon_wid)] forState:UIControlStateNormal];
[self->_like setFrame:origin];
}];
}];
除此之外还在评论框的弹出与收回
性别的设置界面
使用到了动画。采用的原因主要是为了让界面更加美观与流畅。
一些细节
-
注册页面中对密码强度进行判断
通过给UITextField添加监听事件时时获取用户输入,从而对当前密码强度进行实时判断。
//监听的键盘事件 -(void)putinEvent:(UITextField*)text{ if(_passwd.text.length>0){ [_strengthView changeShow:_passwd.text];//更改密码强度的显示 } else { [_strengthView initShow]; } }
(全为字母或者数字则强度最低,有数字加字母强度一般,再加上特殊字符强度最高) -
使用延迟等待显示动画完成
LemonBubble提供的显示框没有回掉函数,为单独开启的一个线程,所以为了界面更加美观,使用延迟等待动画完成再进行下一步的跳转。
各个页面用到的技术
-
登录页面(LoginViewController)
页面主要由两个UITextField与一个按钮组成,两个UITextField分别获取用户名与密码,点击登录按钮后对密码进行验证,验证成功后跳转至主页。跳转至注册页面的方法是由一个UILabel实现的,通过对其添加UITapGestureRecognizer点击手势,实现点击跳转。
-
注册页面(signupViewController)
页面包含了3个UITextField分别用于输入用户名,登录密码与确认密码,下方有个按钮,注册成功后会自动跳转至登录页面,并填写好用户名密码(在注册成功后会自动登录,无需点击登录按钮) -
首页(HomePageViewController)
主要由一个UITabelView组成,使用自定义的UITableViewCell,每个cell包括发帖人的用户名、头像、帖子图片、点赞按钮、评论按钮、点赞数量、评论数量、评论列表。
cell的高度相对固定,由评论的数量动态调整高度,当多于2条评论时显示“更多评论”,点击后可进入展示评论列表。
首页中的右下角还有回到顶部按钮,点击后可回到最顶端,实现方法是更改content的位置即可
-
评论列表(allCommentViewController)
由一个UITableView组成,每个cell中为评论者的头像、姓名及评论内容,右方有个按钮,点击可删除自己的评论。 -
发现页面(waterFleedViewController)
主要由一个UICollectionView组成,设置排列布局的列数为3,这里使用到了GXWaterCollectionViewLayout,方便对布局进行管理。GXWaterCollectionViewLayout *water=[[GXWaterCollectionViewLayout alloc]init]; water.numberOfColumns=2; water.sectionInset = UIEdgeInsetsMake(20, 20, 20, 20); water.scrollDirection = UICollectionViewScrollDirectionVertical; water.headerSize = CGSizeMake(self.view.bounds.size.width, 40); water.footerSize = CGSizeMake(self.view.bounds.size.width, 40); water.delegate = self; UICollectionView*table=[[UICollectionView alloc]initWithFrame:self.view.bounds collectionViewLayout:water];
-
发布界面(PublicationViewController)
这个界面由一个用户头像(UIImageView)与用户名(UILabel)以及一个上传图片的按钮组成。一次最多上传8张图片,加号按钮会随着图片的数量自动浮动。
实现的方法是预先设置几个位置,然后根据上传图片的数量调整按钮的位置。-(void)setButtonPo:(int)order{ float x,y; float wid=self.view.frame.size.width; float left=wid/2-150-25; x=(order%3)*125+left; y=(order/3)*125+110; [_bu setFrame:CGRectMake(x, y, 100, 100)]; }
-
个人信息界面(MineViewController)
视图上方为一个UIView,用于显示用户头像与用户名以及个性签名,下方为一个UITableView,展示5个可以更改的属性。每个属性为一个cell,有两个UILabel,右方一个按钮,点击之后进入设置界面。 -
设置界面(Setting)
该界面会根据传入参数的不同添加不同的组件,传入的参数由个人信息界面的点击cell中的按钮来决定。
(1)设置用户名、地址、个性签名,这三者的界面是类似的,都只有一个UITextField,输入更改的内容即可。
(2)设置性别界面由3个按钮组成
点击相应的按钮即可完成性别的选择。
(3)生日的设置,这里使用到了WSDatePickerView用于显示日期的选择。
-(void)chooseDate{ //NSLog(@"%@", date1); NSDateFormatter *minDateFormater = [[NSDateFormatter alloc] init]; [minDateFormater setDateFormat:@"yyyy年MM月dd日"]; NSDate *scrollToDate = [minDateFormater dateFromString:_birthday]; WSDatePickerView *dateview=[[WSDatePickerView alloc]initWithDateStyle:DateStyleShowYearMonthDay scrollToDate:scrollToDate CompleteBlock:^(NSDate *select) { NSString *date = [select stringWithFormat:@"yyyy年MM月dd日"]; NSLog(@"选择的月日时分:%@",date); self->_birthday=date; self->_birthLab.text=self->_birthday; }]; [dateview show]; }