使用的技术

使用“LemonBubble”进行弹窗提示的显示

主要使用到了2种显示方法:

LKRightBubble(title, time);//正确显示框
LKErrorBubble(title, time);//错误显示框

效果如下:
在这里插入图片描述
显示时会有一段简单的动画,调用时也非常的方便。

使用“AVOSCloud”对数据进行云端的存储,充当后端数据库的作用

主要使用到了如下两张表:

表名:_User用于储存用户的信息的表
objectId每个用户内部的唯一标识,不可更改
username用户名(登录时使用,可以更改)
password用户密码
sex用户性别
birthday生日
address地址
qianming个性签名
headImgAVFile,为用户的头像
表名: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];
   }];
}];

除此之外还在评论框的弹出与收回
在这里插入图片描述
性别的设置界面
在这里插入图片描述
使用到了动画。采用的原因主要是为了让界面更加美观与流畅。

一些细节

  1. 注册页面中对密码强度进行判断
    通过给UITextField添加监听事件时时获取用户输入,从而对当前密码强度进行实时判断。
    在这里插入图片描述

    //监听的键盘事件
    -(void)putinEvent:(UITextField*)text{
        if(_passwd.text.length>0){
            [_strengthView changeShow:_passwd.text];//更改密码强度的显示
        } else {
            [_strengthView initShow];
        }
    }
    

    在这里插入图片描述
    (全为字母或者数字则强度最低,有数字加字母强度一般,再加上特殊字符强度最高)

  2. 使用延迟等待显示动画完成
    LemonBubble提供的显示框没有回掉函数,为单独开启的一个线程,所以为了界面更加美观,使用延迟等待动画完成再进行下一步的跳转。
    在这里插入图片描述

各个页面用到的技术

  1. 登录页面(LoginViewController)
    页面主要由两个UITextField与一个按钮组成,两个UITextField分别获取用户名与密码,点击登录按钮后对密码进行验证,验证成功后跳转至主页。跳转至注册页面的方法是由一个UILabel实现的,通过对其添加UITapGestureRecognizer点击手势,实现点击跳转。
    在这里插入图片描述

  2. 注册页面(signupViewController)
    页面包含了3个UITextField分别用于输入用户名,登录密码与确认密码,下方有个按钮,注册成功后会自动跳转至登录页面,并填写好用户名密码(在注册成功后会自动登录,无需点击登录按钮)

  3. 首页(HomePageViewController)
    主要由一个UITabelView组成,使用自定义的UITableViewCell,每个cell包括发帖人的用户名、头像、帖子图片、点赞按钮、评论按钮、点赞数量、评论数量、评论列表。
    在这里插入图片描述
    cell的高度相对固定,由评论的数量动态调整高度,当多于2条评论时显示“更多评论”,点击后可进入展示评论列表。
    在这里插入图片描述
    首页中的右下角还有回到顶部按钮,点击后可回到最顶端,实现方法是更改content的位置即可
    在这里插入图片描述

  4. 评论列表(allCommentViewController)
    在这里插入图片描述
    由一个UITableView组成,每个cell中为评论者的头像、姓名及评论内容,右方有个按钮,点击可删除自己的评论。

  5. 发现页面(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];
    
  6. 发布界面(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)];
    }
    
  7. 个人信息界面(MineViewController)
    在这里插入图片描述
    视图上方为一个UIView,用于显示用户头像与用户名以及个性签名,下方为一个UITableView,展示5个可以更改的属性。每个属性为一个cell,有两个UILabel,右方一个按钮,点击之后进入设置界面。

  8. 设置界面(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];
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值