cell的一些事

1、cell的分割线 与 左右间距设置

  • 第一步:首先去除系统自带的分割线,设置分割线的样式separatorStyle为None;

  • 方案一:给每个cell的底部添加一个UIView作为分隔线

  • 方案二:直接让美工提供一个带分割线效果的背景图片
  • 方案三:重写cell的setFrame:方法,让其高度减小

    • 使用重写setFrame:方法能够监听所有修改frame的操作,还可以实现让Cell的左右两边存有一定的间距,当然如果你怕用户修改bounds方法监听不到,你还可以重写setBounds:方法,修改x与height

      Snip20150906_12.png
  • 注意:

    • 重写系统的setFrame好处,可以监听到所有修改frame的操作
      • 应用场合:自定义控件,不希望外界改变尺寸,有个默认宽高100、100,实现方式:重写setFrame:和setBounds:方法,对比initWithFrame修改的好处是,initWithFrame:外界还可以手动修改控件的尺寸,而前者真正办到了屏蔽外界的修改。

2、cell点击弹出menu菜单


Snip20151027_5.png
方案一:
  • 自定义xib,直接让美工提供一个弹出框的背景图片,然后添加对应的按钮在上面,然后,监听点击的区域进行不同的逻辑处理
  • 点击Cell时,就弹出上面的自定义的控件到对应的位置即可。
方案二:自己给Cell添加UIMenuController功能
  • 苹果自带的有UIMenuController功能,请参照之前的文章,有详
  • 1.监听Cell选中事件,弹出菜单,并设置菜单显示内容与frame
    • 弹出菜单,相对Cell中间的一条线,显示位置如上图所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 取出cell
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    UIMenuController *menu = [UIMenuController sharedMenuController];

    // 设置菜单内容
    menu.menuItems = @[
                       [[UIMenuItem alloc] initWithTitle:@"顶" action:@selector(ding:)],
                       [[UIMenuItem alloc] initWithTitle:@"回复" action:@selector(reply:)],
                       [[UIMenuItem alloc] initWithTitle:@"举报" action:@selector(warn:)]
                       ];

    // 显示位置 : 参考Cell的左上角,指向Cell中间的一条高1的位置
   /*
     targetRect:menuController指向的矩形框
     targetView:targetRect以targetView的左上角为坐标原点
     */
    CGRect rect = CGRectMake(0, cell.height * 0.5, cell.width, 1);
    [menu setTargetRect:rect inView:cell];

    // 显示出来
    [menu setMenuVisible:YES animated:YES];
}
  • 2.处理菜单事件

    • canPerformAction:方法中,if (!self.isFirstResponder) 分析,判断的理由如下:
      • 1.因为,菜单项是针对第一响应者的,现在第一响应者是控制器,所以菜单项是添加到Cell上的,
      • 2.但是如果而是文本框成为了第一响应者,那样的话,这些菜单项也会显示到文本框的,但是这些不是我们想要的,所以我们需要判断处理,如果if (!self.isFirstResponder) 就不显示自定义的菜单项

    Snip20151028_14.png
#pragma mark - UIMenuController处理
- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (!self.isFirstResponder) { // 文本框弹出键盘, 文本框才是第一响应者
        if (action == @selector(ding:)
            || action == @selector(reply:)
            || action == @selector(warn:)) return NO;
    }

    return [super canPerformAction:action withSender:sender];
}

- (void)ding:(UIMenuController *)menu
{
    JPLog(@"ding - %@ %@",
           self.selectedComment.user.username,
           self.selectedComment.content);
}

- (void)reply:(UIMenuController *)menu
{
    JPLog(@"reply - %@ %@",
           self.selectedComment.user.username,
           self.selectedComment.content);
}

- (void)warn:(UIMenuController *)menu
{
    JPLog(@"warn - %@ %@",
           self.selectedComment.user.username,
           self.selectedComment.content);
}

3、自定义Cell不等高

3.1 思路分析:
  • 1.模型决定cell显示,所有Cell的数据由模型提供,Cell只是展示数据
  • 2.某些时候,我们需要将Cell的高度作为模型的一个属性或者Cell的一个属性保存起来,避免重复计算Cell的高度。
  • 3.牢记,代理返回Cell的高度的方法先调用,才会调用返回数据源的Cell的方法,所以我们可以在返回计算高度的方法中:根据指定Cell的模型计算出Cell的高度->相当于缓存起来。如何做到缓存?(就是当模型中保存Cell高度的属性<=0时就计算高度后->将高度保存到模型中缓存起来,而且返回计算好的cell的高度,模型中Cell的高度属性>0就表示计算过了不用计算:直接返回高度),所以我们在数据源方法返回Cell,调用返回Cell的高度方法-》返回了计算好的Cell的高度,从而实现了不等高
3.2 实现方案
  • 如果比较简单层次结构-》那么使用自动布局就可以解决了
  • 如果比较层次结构比较复杂 -》那么能使用自动布局就使用,再不能我们就通过代码和添加约束的方式实现不等高Cell。


作者:iOS_成才录
链接:http://www.jianshu.com/p/971fda5f2292
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值