2011-03-23 56 views
1

如何设置在UITableViewCell中以编程方式放置的子视图的大小?如何设置自定义UIView的大小/位置以将其放置在自定义UITableViewCell中?

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

问题 - 我不知道如何正确设置自定义UIView行的大小/位置?我如何在自定义UIView layoutSubviews方法中确定它的x,y,宽度和高度,以便我可以定位它?

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

希望这是有道理的。

结构是:

动态自定义UITableCellView(子类)

  • 确定rowHeight的动态中heightForRowAtIndexPath
  • 在layoutSubviews它包括通过子视图循环(自定义的的UIView我)
  • 并调用layoutSubview

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

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

它更多的思考如何保持UIView行的位置更新,注意到UITableView的动态性质。例如,当用户单击UITableView的工具栏中的增加/减小字体isze时,则需要确保(a)行高相应地改变,(b)子类UITableViewCell中的标题标签改变,以及(c)所有定制对UITableViewCell子视图的UIView行也根据大小/位置进行更新。 – Greg 2011-03-24 02:33:20

回答

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]; 
+0

所以也许我需要做的事情(注意我在主要问题下的评论 - 请参阅上文)确保在UITableViewCell layoutSubviews方法中,当我遍历所有调用其layoutSubview方法的子视图行时,同时我应该重置子视图的框架? – Greg 2011-03-24 02:35:13

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; 
}