如何覆盖UITableViewCell中的accessoryView来改变它的位置

时间:2013-05-27 20:01:50

标签: iphone ios uitableview

默认情况下,accessoryView上的UITableViewCell位于单元格的最右侧。我正在对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];
}

enter image description here

4 个答案:

答案 0 :(得分:6)

在您的单元子类中实现layoutSubviews,首先调用super,然后修改要更改的子视图的帧。

答案 1 :(得分:1)

这类似于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; });

答案 2 :(得分:0)

根据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;

答案 3 :(得分:0)

最简单的方法是定义一个自定义单元格,将 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
}