动弹

作者: 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,看一下网易新闻客户端的结构。

相关文章

  • 动弹

    2016-11-03 TweetTableViewController类:此类继承自OSCObjsViewCont...

  • 11 还是动弹动弹好

    歇了两天,今天下午终于踏上运动垫了,我这个激动啊!拉伸半小时,浑身舒坦,接下来来了个平板撑,90秒!这大概是我做...

  • 不想动弹

    想法超级多,行动超级少,还有现在不想动弹,我的意志力消散的非常厉害,难得有了时间,却如此懒散,要命哦!我一定是病了...

  • 不想动弹

    每天晚上陪小懒懒睡觉,我躺在旁边不能看手机,闭着眼睛,躺着躺着就来了瞌睡,如果不是还要起床刷牙,真想直接睡了。 最...

  • 滚动弹幕

    偷张图,免得自己还得录像转换来源:https://www.jianshu.com/p/e55b73f3e913 第...

  • 太累不想动弹

    照常每天都是300多份快餐,最近桃子熟了,很多外地商人过来拉桃子。 午后回趟父母家,栽了一席秧苗匆匆上班。身体微弱...

  • 晚上不想动弹

    今天白天忙碌了一天,下午的时候也接了孩子们放学,再到备课的课室。孩子们玩了一会之后,就按照约定开始静下心来做...

  • 懒得动弹

    又好久没有写简书了,其实也不是忙的一点功夫都没有,还是自己主观能动性上的欠缺,不知道为什么对写简书失去了原来的兴奋...

  • 你的舒适圈“圈”得住你吗?

    01 前段时间,看到这样一条短视频: A:你能不能从床上起来动弹动弹? B:我为什么要起来动弹动弹? A:离开舒适...

  • 手脚蜷缩,不得动弹

    对自己的存在产生质疑了,怎么会有这么没用的人,什么都做不好,这么不值得信任,想消失,完全符合一个胆小鬼的本质。想消...

网友评论

      本文标题:动弹

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