【问题标题】:How can I customize the accessory disclosure image in a UITableViewCell?如何自定义 UITableViewCell 中的附件披露图像?
【发布时间】:2010-09-29 01:25:23
【问题描述】:

我想在我的 UITableView 中使用标准披露附件图像的自定义版本。我怎样才能做到这一点?我希望 UITableViewCell 子类对于这个基本的东西不是必需的。

【问题讨论】:

    标签: cocoa-touch uitableview


    【解决方案1】:

    您需要创建一个自定义视图并将其分配给UITableViewCell 对象的accessoryView 属性。比如:

    myCell.accessoryView = [[ UIImageView alloc ] 
                           initWithImage:[UIImage imageNamed:@"Something" ]];
    

    【讨论】:

    • 如果我这样做,我注意到 UITableViewDelegate 方法 -[tableView:accessoryButtonTappedForRowWithIndexPath:] 不再被调用。这是预期的行为吗?有没有办法让这个方法继续工作?
    • 可以在 UITableViewCell 上使用 UIApperance 代理吗?
    • 我使用这种方法继承了 UITableViewCell (DisclosureCell) 的子类,然后所有带有自定义披露指示符的单元格都继承自 DisclosureCell。
    【解决方案2】:
    - (UITableViewCell *)tableView:(UITableView *)tView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        UIImage *indicatorImage = [UIImage imageNamed:@"Arrow.png"];
        cell.accessoryView =[[[UIImageView alloc]  initWithImage:indicatorImage] autorelease];
    
    
        return cell;
    }
    

    我用上面给出的帮助代码来做这个

    【讨论】:

      【解决方案3】:

      我遇到了与 Greg 相同的问题——附件视图不跟踪(如果您使用 UIImageView)

      我是这样解决的:

      UIImage * image = [ UIImage imageNamed:@"disclosure-button-grey.png" ] ;
      UIControl * c = [ [ UIControl alloc ] initWithFrame:(CGRect){ CGPointZero, image.size } ] ;
      
      c.layer.contents = (id)image.CGImage ;
      [ c addTarget:self action:@selector( accessoryTapped: ) forControlEvents:UIControlEventTouchUpInside ] ;
      cell.accessoryView = c ;
      [ c release ] ;
      

      【讨论】:

      • 为什么不直接使用简单的 UIButton 和图像,而不是摆弄图层内容?
      • 我觉得我一定已经尝试过了,但由于某种原因它不起作用?但可以肯定的是,首先尝试使用 UIButton...
      • 使用自定义图像时,位置可能会发生变化,用户可能无法点击它,因为它的框架可能很小。最好在附件视图上方添加一个子视图按钮,这样您就可以处理大小和位置。
      【解决方案4】:

      有一个nice example from Apple 展示了如何使用UIControl 来完成这种附件视图自定义。

      在 UIControl 中覆盖 - (void)drawRect:(CGRect)rect 不是最简单的方法,但可以为您提供很大的灵活性来设置漂亮的附件视图的样式。

      【讨论】:

        【解决方案5】:

        我会这样做:

        UIImageView *chevronImgVw = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"chevron_accessory_vw_img.png"]];
        chevronImgVw.frame = CGRectMake(cell.accessoryView.frame.origin.x, cell.accessoryView.frame.origin.y, 10, 20);
        cell.accessoryView = chevronImgVw;
        

        请在投反对票之前先尝试一下!因为目前它有 2 个赞成票和 2 个反对票!

        【讨论】:

          【解决方案6】:

          斯威夫特 4 & 5:

          这对我有用:

          class MyCell: UITableViewCell {
          
          // boilerplate...
          
              fileprivate func commonInit() {
                  // This is the button we want, just need to change the image.
                  accessoryType = .detailButton
              }
          
              open override func layoutSubviews() {
                  super.layoutSubviews()
                  // Grab the "detail" button to change its icon. Functionality is set in the delegate.
                  if let submitButton = allSubviews.compactMap({ $0 as? UIButton }).first {
                      submitButton.setImage(#imageLiteral(resourceName: "icons8-enter-1"), for: .normal)
                  }
              }
          
             // everything else...
          }
          

          最重要的是,这让我可以使用tableView(_:accessoryButtonTappedForRowWith:) 来处理按钮操作。

          我将它用于按钮,但相同的技术适用于显示图像,[因为/只要]在您要触摸的元素的层次结构树的该分支中只有一个类。


          哦,对了,我的代码这样称呼:

          extension UIView {
              var allSubviews: [UIView] {
                  return subviews.flatMap { [$0] + $0.allSubviews }
              }
          }
          

          【讨论】:

            【解决方案7】:

            在 Swift 4 和 5 中

            myCell.accessoryView = UIImageView(image: UIImage(named: "Something"))
            

            【讨论】:

              【解决方案8】:

              注意:请勿将自定义单元格设置为 tag:0。该标签是为 textLabel 视图保留的。如果您在 Xcode Storyboard 中设置标签,您必须将自定义视图/标签的标签设置为 1 或更高。

              注意苹果的例子:

                  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath (NSIndexPath *)indexPath
              {
              UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
              
                  UILabel *label;
              
                  label = (UILabel *)[cell viewWithTag:1];
                  label.text = [NSString stringWithFormat:@"%d", indexPath.row];
              
                  label = (UILabel *)[cell viewWithTag:2];
                  label.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row];
              
                  return cell;
              }
              

              【讨论】:

                【解决方案9】:

                我尝试了上面的代码,但它似乎不再工作了,可能是因为这篇文章的年代久远,所以我会放弃我的行,它给了我自定义的附件视图。

                [cell setAccessoryView:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrowBtn"]]];
                

                希望有人觉得这很有用。

                【讨论】:

                • Tom,这个条目上接受的答案是完全一样的。我在这里错过了什么?
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-06-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-10-01
                • 1970-01-01
                相关资源
                最近更新 更多