iOS -- Cell功能列表

作者: iOS_成才录 | 来源:发表于2015-11-12 19:19 被阅读2521次

    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 -- Cell功能列表

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