动弹

作者: ProgressChen | 来源:发表于2016-11-03 22:19 被阅读26次

    2016-11-03

    TweetTableViewController类:
    此类继承自OSCObjsViewController,而OSCObjsViewController继承自UITableViewController。
    问题:

    1. _textView属性的作用。
      经过试验验证,此属性可以去掉。

    动弹JSON数据格式

    {
        "code": 1,
        "message": "SUCCESS",
        "result":{...
         },
           "time": "2016-11-03 21:07:21"
    }
    

    code :

    1 表示热门动弹
    2 表示最新动弹
    3 具体用户的id则是获取这个用户的动弹列表
    

    message:

     是否成功
    

    result:

     返回的动弹数据
    
                "appClient": 3,
                "author": {
                    "id": 1761914,
                    "name": "流年浅夏",
                    "portrait": "http://static.oschina.net/uploads/user/880/1761914_50.jpg?t=1470725915000"
                },
                "commentCount": 0,
                "content": "我每天都能發動彈,可我就是買不起房。 ",
                "href": "https://my.oschina.net/das/tweet/10968283",
                "id": 10968283,
                "images": [{
                    "h": 414,
                    "href": "http://static.oschina.net/uploads/space/2016/1103/210236_nlL1_1761914.jpg",
                    "name": "210236_nlL1_1761914",
                    "thumb": "http://static.oschina.net/uploads/space/2016/1103/210236_nlL1_1761914_thumb.jpg",
                    "type": "jpg",
                    "w": 434
                }],
                "likeCount": 1,
                "liked": false,
                "pubDate": "2016-11-03 21:02:34"
    

    说明:
    - appclient 动弹来源客户端类型
    - author 动弹的作者
    |-- id:作者id
    |-- name:作者昵称
    |-- portrait:作者头像地址
    - commentCount 动弹评论数量
    - content 动弹的内容
    - href 动弹的连接,单击此动弹后跳转到位置
    - id 动弹的id
    - images 动弹内容中有图片
    |-- h:图片高度
    |-- href: 大图片地址
    |-- name:图片名称
    |-- thumb:缩略图地址
    |-- type: 图片类型
    |-- w: 图片宽度
    - likeCount 动弹的点赞数量
    - liked 是否已经对该动弹点赞
    - pubDate 动弹发布日期

    time:

    请求时间
    

    2016-11-04

    OSCTweetItem类:
    主要是动弹数据,是一个Model

    此Model中有2个setter方法:

    1. -(void)setContent:(NSString *)content; 主要是用于根据content内容设置textField frame的大小.

    其中用到NSString的一个实例方法。

    //主要根据给定的size, 属性来生成一个CGRect
    - (CGRect)boundingRectWithSize:(CGSize)size  
                           options:(NSStringDrawingOptions)options  
                        attributes:(NSDictionary<NSString *,id> *)attributes  
                           context:(NSStringDrawingContext *)context;
    
    1. -(void)setImages:(NSArray<OSCTweetImages *> *)images;根据图片的数量设置图片显示的frame

    Cell

    主要根据是否有图片来确定返回的cell类型。一共有3中CELL

    1. OSCTextTweetCell 没有图片的CELL,只有文本信息
    2. OSCImageTweetCell 有一张图片的CELL
    3. OSCMultipleTweetCell 有多张图片的CELL

    上述3种CELL都继承自AsyncDisplayTableViewCell
    先看一下AsyncDisplayTableViewCell
    这个类中定义了5个协议, CODE如下:

    //用户头像被点击
    - (void)userPortraitDidClick:(__kindof AsyncDisplayTableViewCell* )cell;
    
    //改变动弹状态,如点赞,目前只是实现了此功能
    - (void)changeTweetStausButtonDidClick:(__kindof AsyncDisplayTableViewCell* )cell;
    
    - (void)shouldInteractTextView:(UITextView* )textView
                               URL:(NSURL *)URL
                           inRange:(NSRange)characterRange;
    
    - (void)textViewTouchPointProcessing:(UITapGestureRecognizer* )tap;
    
    @optional   //可选协议,对于有图片的动弹,点击图片会加载大图片。
    - (void)loadLargeImageDidFinsh:(__kindof AsyncDisplayTableViewCell *)cell
                    photoGroupView:(OSCPhotoGroupView *)groupView
                          fromView:(UIImageView *)fromView;
    

    2016-11-06

    坑1,pageToken 干什么用的。

    填坑:通过抓包发现pageToken其实相当请求了不同的页面
    pageToken=&type=2请求的是热门动弹
    pageToken=&type=1请求的是最新动弹

    坑2, 动弹的cell没有注册就可以dequeueReusableCellWithIdentifier:?

    填坑

    复用cell有两种方法:
    //这种是老方法,返回值需要判断是否为nil,不需要提前注册

    • (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;
      //iOS6之后添加的,需要提前注册。
    • (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;
      //注册方法有可以通过nib或Class
    • (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier;
    • (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier;

    再读AsyncDisplayTableViewCell类。
    *- (void)handleTextView:(UITextView )textView 用与Cell中的UITextView设置复制,拷贝菜单的显示如图:

    Paste_Image.png

    覆盖了UIPasteboard的2个方法,用于实现自定的menu,上图中的复制就是自定义的菜单。

    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
    {
        return _canPerformAction(self, action);
    }
    - (BOOL)canBecomeFirstResponder
    {
        return YES;
    }
    

    这个类中还处理了一些动弹中的图片设置,如点赞图片,回复图片。

    OSCTextTweetCell

    此类使用了YYKit,来制作一些文字效果。

    以下是此类中声明的变量,YYLabel就YYKit中的一个控件。

    @interface OSCTextTweetCell ()<UITextViewDelegate>{
        __weak UIImageView* _userPortrait ;
        __weak YYLabel* _nameLabel;
        __weak UITextView* _descTextView;
        __weak YYLabel* _timeAndSourceLabel;
        __weak UIImageView* _likeCountButton;
        __weak YYLabel* _likeCountLabel;
        __weak UIImageView* _commentCountBtn;
        __weak YYLabel* _commentCountLabel;
        __weak CALayer* _colorLine;
    }
    @end
    

    坑3. CELL中的布局使用是原生的布局方式or第三方扩展方式?代码如下:

    _userPortrait.size = (CGSize){userPortrait_W,userPortrait_H};
    _userPortrait.left = padding_left;
    _userPortrait.top = padding_top;
    

    填坑

    上述代码使用的是第三方进行的布局设置YYKit,定义了UIView的分类。

    - (void)prepareForReuse; 重用操作在对cell进行复用是会自动调用此方法。

    2016-11-12

    UIPasteboard

    相当于粘贴板,用于本APP的数据交换或其他APP可以使用从本APP中复制的一些数据。
    粘贴板又分为系统级和app级别,系统级可以整个系统内都可以使用,比如我们在微博中复制了一段文字,使用Safari进行搜索。
    app级别相当于自定义的一个UIMenuItem,将相应的方法添加到
    UIMenuController中,如下代码:

     UIMenuController *menuController = [UIMenuController sharedMenuController];
        
        [menuController setMenuVisible:YES animated:YES];
        [menuController setMenuItems:@[
                                       [[UIMenuItem alloc] initWithTitle:@"复制" action:NSSelectorFromString(@"copyText:")],   //设置自定义的方法--“copyText:”和显示的名字--“复制”
                                       [[UIMenuItem alloc] initWithTitle:@"删除" action:NSSelectorFromString(@"deleteObject:")]
                                       ]];
    

    挖坑:

    • 坑1 在tableView中如何实现长按某一个cell,弹出自定义的menu.

    填坑:

     先了解一下基础知识:
    

    剪贴板类型:

    系统级别:使用UIPasteboardNameGeneral和UIPasteboardNameFind,系统级应用程序关闭,或者卸载的数据不会丢失。
    应用程序级:通过设置,可以让数据在应用程序关闭之后仍然保存在剪贴板中,但是应用程序卸载之后数据就会失去。我们可用通过pasteboardWithName:create:来创建。
    

    在ios中,支持UIPasteboard原生控件只有UITextField 、UITextView、UIWebView这三个,如果想自定义一个控件能够使用UIPasteboard,需要在定义的时候重载一下两个方法:

    -(BOOL)canBecomeFirstResponder //设置为第一响应者
    -(BOOL)canPerformAction:(SEL)action withSender:(id)sender
    /*****
    决定这个控件能够使用复制、剪切、选中、全选、粘贴等的哪一种或几种功能,并重载对应的-(void)copy:(id)sender、-(void)cut:(id)sender、-(void)select:(id)sender、-(void)selectAll:(id)sender、-(void)paste:(id)sender方法,在这几个方法中处理事件,UIMenuController负责显示UI。
    *****/

    针对自定义的menu上个例子说明一下:
    1 在AppDelegate.m文件中加入一下方法:

    UIMenuController *menuController = [UIMenuController sharedMenuController];
    
     [menuController setMenuVisible:YES animated:YES];
     [menuController setMenuItems:@[
               [[UIMenuItem alloc] initWithTitle:@"myCopy"
                     action:NSSelectorFromString(@"copyText:")]
               ]]; //将自己定义的菜单添加到sharedMenuController中,名字为myCopy,对应的方法为copyText:
    

    2 在需要自定义的控件中重载UIPasteboard的2个方法,本栗子是在自定义的cell中进行重载的。

    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
    {
     if (action == @selector(copyText:)) {
      return YES;
     };
     
     return NO;
    }
    - (BOOL)canBecomeFirstResponder
    {
     return YES;
    }
    

    3 实现copyText:方法

    - (void)copyText:(id)sender{
     NSLog(@"执行copyText");
    }
    

    4 实现效果:


    自定义cell.png

    2016-11-15

    很悲催,到现在动弹页面还没搞定,呜呜。
    接着挖坑
    坑1,动弹中有3个子页面包括,“最新动弹”,“热门动弹”,“我的动弹”如何实现。

    2016-11-16

    动弹详情控制器:TweetDetailNewTableViewController
    1,动弹详情中的点赞列表和评论列表之间的切换怎么重新加载数据的,reloadData?
    确实执行了reloadData,记得reloadData有性能的影响。
    1.1 tableView中的reloadData的性能?
    2,动弹详情页面push时传递了什么参数?
    这个视图不是直接被push出来的,而是作为TweetDetailsWithBottomBarViewController的子控制器进行处理
    从动弹列表中跳转到动弹详情代码:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        
        OSCTweetItem *tweet = self.dataModels[indexPath.row];
        
        TweetDetailsWithBottomBarViewController *tweetDetailsBVC = [[TweetDetailsWithBottomBarViewController alloc] initWithTweetID:tweet.id];
        [self.navigationController pushViewController:tweetDetailsBVC animated:YES];
    }
    

    push是使用的tweet.id进行数据传递的,TweetDetailsWithBottomBarViewController 在加载TweetDetailNewTableViewController控制器时将tweet.id进行正向传值,TweetDetailNewTableViewController通过此ID进行网络数据请求从而进行相应的Cell设置。

    3,TweetDetailsWithBottomBarViewController类的功能?

    逻辑图.png

    2016-11-17

    1,如何使一个子类必须覆盖父类中某一个方法?
    在父类方法中使用断言来提示NSAssert(false, @"over ride subclass");不过此方法只能在运行时才会被发现。

    2,看一下网易新闻客户端的结构。

    相关文章

      网友评论

          本文标题:动弹

          本文链接:https://www.haomeiwen.com/subject/bsmbuttx.html