1

如何设置以编程方式放置在 UITableViewCell 中的子视图的大小?

我有一个自定义(子类)UITableViewCell,其中单元格的一部分包括许多行(动态),这些行被实现为自定义 UIView。这个想法是创建自定义视图(这是一行项目),然后当 UITableViewCell 命中 layoutSubviews 时,它将(a)设置自己重新定位并(b)循环并在每一行上调用“layoutSubviews”它用于行的自定义 UIView。

问题- 我不确定如何正确设置自定义 UIView 行的大小/位置?我如何在自定义 UIView layoutSubviews 方法中确定它的 x、y、width、height 以便我可以定位它?

例如,我实际上是否需要在 UITableCellView 的 layoutSubviews 方法中手动循环遍历所有行并调用它们的自定义方法来传递它们需要的位置/宽度/高度?然后当自定义 UIView 行的 layoutSubview 方法被击中时,它会知道查找存储这些值以使用它们的实例变量吗?

希望这是有道理的。

结构是:

动态自定义 UITableCellView(子类)

  • 在 heightForRowAtIndexPath 中动态确定 rowHeight
  • 在 layoutSubviews 中,它包括遍历子视图(我拥有的自定义 UIView)并在每个子视图上调用 layoutSubview

在自定义 UIView 中(代表一行项目,例如 UILabel)

  • 在 layoutSubview 中 - 问题:如何设置此子视图的框架大小?
  • 我假设框架的 x,y 应该是 0,0?
  • 对于宽度/高度,您如何获得应该设置的超级视图区域的完整大小?
  • superview 是否应该在 layoutSubviews 之前将这些信息传递给它?
4

2 回答 2

3

您可以使用 resize 方法向 UIView 添加类别。

UIView+ResizeMethods.h

- (void) setHeight: (CGFloat) height;
- (void) setWidth: (CGFloat) width;
- (void) setTop: (CGFloat) top;
- (void) setLeft: (CGFloat) left;

UIView+ResizeMethods.m

- (void) setHeight: (CGFloat) height {
    CGRect frame = self.frame;
    frame.size.height = height;
    self.frame = frame;
}
- (void) setWidth: (CGFloat) width {
    CGRect frame = self.frame;
    frame.size.width = width;
    self.frame = frame;
}
- (void) setTop: (CGFloat) top {
    CGRect frame = self.frame;
    frame.origin.y = top;
    self.frame = frame;
}
- (void) setLeft: (CGFloat) left {
    CGRect frame = self.frame;
    frame.origin.x = left;
    self.frame = frame;
}
于 2013-04-18T19:03:46.697 回答
1

作为 tableViewCell 子类的一部分添加的任何视图都相对于单元格框架定位,即子视图原点的 x:0,y:0 将是 tableCell 的左上角。这样的事情应该足以让你开始。

CGRect frame =[self frame];
frame.size.height=20.0f;
frame.origin.x=(self.frame.size.height/2)-frame.size.height;
frame.origin.y=0.0f;
[subview setFrame:frame];
于 2011-03-23T21:36:48.310 回答