Iphone 定位UITableViewCell的imageView

Iphone 定位UITableViewCell的imageView,iphone,cocoa-touch,uitableview,uiimageview,Iphone,Cocoa Touch,Uitableview,Uiimageview,在UITableView的每个UITableView单元格中,我都在其imageView中放置了一个图像。但是,如果我使用tableView:heightForRowAtIndexPath:增加单元格高度以容纳更多文本,我发现: 图像垂直居中对齐 图像的左边距增加。这将向右推动文本,使其左边距不再与上下单元格中的文本对齐 我希望图像垂直对齐,使其位于单元格的左上角(如下图中的第一个单元格),并且不增加其左边框(使第二个单元格中文本的左边框与第一个单元格中的文本对齐) 改变imageView的框架

在UITableView的每个UITableView单元格中,我都在其imageView中放置了一个图像。但是,如果我使用tableView:heightForRowAtIndexPath:增加单元格高度以容纳更多文本,我发现:

  • 图像垂直居中对齐
  • 图像的左边距增加。这将向右推动文本,使其左边距不再与上下单元格中的文本对齐
  • 我希望图像垂直对齐,使其位于单元格的左上角(如下图中的第一个单元格),并且不增加其左边框(使第二个单元格中文本的左边框与第一个单元格中的文本对齐)

    改变imageView的框架、中心等似乎没有影响。有什么想法吗?谢谢


    (我对这个问题有一个印象,但现在还不让我发布一个印象,因为我是一个名声不到10的noob。Grrr…)

    您可以创建自定义单元格,将对象放置在需要的位置,并设置自动遮罩值。

    当您认为需要调整默认样式中项目的大小或位置时,是您需要考虑使用自己的项目创建自定义单元格的时间,这些项目的大小和位置符合您的要求。这就是您可以创建自定义单元格的原因。:)

    您需要将UITableViewCell子类化并覆盖LayoutSubView,如下所示:

    - (void) layoutSubviews
    {   
        [super layoutSubviews];
    
        self.imageView.frame = CGRectMake( 10, 10, 50, 50 ); // your positioning here
    }
    

    在CellForRowatineXpath:方法中,请确保返回新单元格类型的实例。

    一个您可能没有尝试过的非常有用的函数(在
    UITableViewDelegate
    中)是
    tableView:willDisplayCell:ForRowatineXpath:
    。它在显示单元格之前立即调用,其目的是使您能够对布局执行操作,而无需操作系统在显示之前再次修改布局。实际上,你拥有完全的控制权。我用它来改变单元格中的字体,但你也可以迭代单元格的子视图并修改它们的框架

    我仍然同意,现在是时候研究定制单元并停止与操作系统的斗争了。这并不难做到,苹果在这方面给出了一个很好的例子。

    另一种方法(适用于iOS 6)是创建UIImageView并将其作为子视图添加到单元格中

     UIImageView *yourImageView = [[UIImageView alloc] initWithFrame:CGRectMake(x,y,20,20)];
    
    [yourImageView setImage:[UIImage imageNamed:[imagesArray objectAtIndex:indexPath.row]]]; //You can have an Array with the name of 
    
    [yourcell.contentView addSubview:yourImageView]; //add the imageView as a subview
    

    Swift 4 TomSwift解决方案的变体(对我很有效):


    你能解释一下苹果文档中对这种方法的解释吗?例如,为什么不能执行imageView.frame=CGRectMake(10,10,50,50)?(这不起作用,但我不明白为什么它不起作用。它似乎应该起作用)它不起作用,因为超类在其LayoutSubView的实现中进行布局。通过调用[super layoutSubviews],superclas将定位imaveView和任何其他标签/图标,然后您可以重新定位它们。这可能有助于理解UITableViewCell只是一个UIView,它还可以“免费”为您管理和定位这些子视图标签和图像。你可以很容易地画出整个单元格,做任何你想做的事情(例如,绕着球弹跳)。在定制曲线的某个点上,这正是您应该做的。汤姆建议的子类是沿着这条路径的一小步。我尝试这样做,但是它仍然在我的表视图单元格中间重新定位图像:<代码> Cell。IVieview。框架= CGRePuthGub(10, 10, 50,50);<代码>。你知道为什么吗?不要直接在
    UITableViewCell
    上添加自定义视图。而是将它们放在
    contentView
    对象下。这就是cell类的设计方式。(参见苹果文档)如果你直接将视图放在单元格上,可能会导致意外的结果。对,你应该弄乱单元格的“内置”属性外观。里维拉:你应该吗?
    override public func layoutSubviews() {
            super.layoutSubviews()
            imageView?.frame = CGRect( x: 16, y: 9, width: imageView!.intrinsicContentSize.width, height:  imageView!.intrinsicContentSize.height)
        }