动弹

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容