【问题标题】:How to override accessoryView in UITableViewCell to change it's position如何覆盖 UITableViewCell 中的 accessoryView 以更改其位置
【发布时间】:2013-05-27 20:01:49
【问题描述】:

默认情况下,UITableViewCell 上的 accessoryView 位于单元格的最右侧。我正在对UITableViewCell 进行子类化,以尝试更改此位置以将其移动到更左侧,但是,它没有任何效果,它仍然在右侧。关于如何做到这一点的任何想法?

- (void) layoutSubviews
{
    [super layoutSubviews];
    self.accessoryView.frame = CGRectMake(100, self.accessoryView.frame.origin.y, self.accessoryView.frame.size.width, self.accessoryView.frame.size.height);
    self.accessoryView.layer.borderWidth = 1;
    self.accessoryView.layer.borderColor = [[UIColor redColor] CGColor];
}

【问题讨论】:

  • AFAIK accessoryView 的默认值是 nil。您必须先创建视图并将其分配给此属性才能对其进行自定义。
  • 您也可以编辑附件视图图像本身,让它在右侧留出更多空白。

标签: iphone ios uitableview


【解决方案1】:

在你的单元子类中实现layoutSubviews,首先调用super,然后修改你想要改变的子视图的框架。

【讨论】:

  • Wain,我试过了,没有任何改变。事实上,我尝试更改背景颜色、添加边框、设置较大的高度并没有任何变化。它仍然把复选标记配件类型放在最右边。
  • 你能展示一下创建单元格的代码和layoutSubviews的实现吗?
  • 从技术上讲,因为您使用的是附件类型而不是附件视图,所以我们依赖于框架实现,看起来它没有使用附件视图。您可能应该创建一个 UIImageView 并将其分配给附件视图。
  • 谢谢韦恩。我刚刚删除了单元格上的附件类型,但我什至无法使用上面的代码显示 accessoryview
  • 正在创建自定义单元格并调用 layoutSubviews ?
【解决方案2】:

这类似于 Flea 的解决方案;将图像推送给定数量而不是固定帧:

static CGFloat const kRightOffset = 10.0;

cell.accessoryView = ({UIImageView * imgV = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"image.png"]];
                CGRect frame = imgV.frame;
                frame.size.width = frame.size.width + kRightOffset;
                imgV.frame = frame;
                [imgV setContentMode:UIViewContentModeLeft];
                imgV; });

【讨论】:

    【解决方案3】:

    根据 Matt 的提示,我发现这样做的唯一方法是使用我自己的 UIImageView 并使用我选择的图像,然后将 frame 坐标设置为我需要的坐标。这允许 accessoryView 扩展。显然这是操纵它的唯一方法。

    UIImage *indicatorImage = [UIImage imageNamed:@"BV-icon_57x57"];
            UIImageView *view = [[UIImageView alloc] initWithImage:indicatorImage];
            view.frame = CGRectMake(0, 0, 100, 20);
            [view setContentMode:UIViewContentModeLeft];//without this line the image will just be stretched;
            cell.accessoryView = view;
    

    【讨论】:

    • 我正在使用您的代码,但它没有向左拍摄图像......它仍然在右边......知道为什么吗??
    • 嘿 Fahim,不幸的是,我无法再访问代码了,我正在一起从事不同的工作,否则我会找你。我知道尝试制作作品是一件非常痛苦的事情。
    • @FahimParkar 这绝对是迟到了一天,还差了一美元,但我今晚一直在解决这个问题,并弄清楚如何让 Flea 的解决方案发挥作用。您必须使用setContentMode 左对齐图像。否则它只会拉伸它。我已经编辑了解决方案。
    【解决方案4】:

    最简单的方法是定义一个自定义单元格,将 Accessory 设置为 none,将代表附件视图的 imageview 放置在您喜欢的任何位置,并为该单元格定义一个点击手势处理程序(如果您想限制点击仅对图像进行手势,只需将点击手势添加到图像视图而不是整个单元格)。这提供了很大的灵活性,而且我们不必处理附件视图带来的烦恼(至少对我来说 - 我不喜欢单元格右侧的边框)

    在您的自定义单元设置代码中:

    let tap = UITapGestureRecognizer(target: self, action: #selector(onCellTapped(_:)))
    self.contentView.addGestureRecognizer(tap)
    
    @objc private func onCellTapped(_: Any) {
       //your code here - i added an imageview that changes image on user tap - to indicate selected/deselected
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-13
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      相关资源
      最近更新 更多