将 autoResizingMask 与 CGRectZero 一起使用

Posted

技术标签:

【中文标题】将 autoResizingMask 与 CGRectZero 一起使用【英文标题】:Using autoResizingMask with CGRectZero 【发布时间】:2012-12-16 20:21:30 【问题描述】:

我正在为 tableview 的部分构建页脚。页脚的高度将在heightForFooterInSection 中指定,因此在viewForFooterInSection 中我只想添加子视图并指定页脚视图应填充指定的任何页脚高度(此页脚大小将是动态的)。因此,我使用CGRectZero 作为初始框架并告诉页脚视图展开以填充其父视图。

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section

    UIView *footerView = [[UIView alloc] initWithFrame:CGRectZero];
    footerView = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    footerView = [UIColor greenColor];
    return footerView;

这按预期工作 - 表格视图的页脚完全被绿色视图填充。

但现在我想在页脚添加一个UITextView。文本视图应填充相同的空间,但留下 5 点边框:


    UIView *footerView = [[UIView alloc] initWithFrame:CGRectZero];
    footerView = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    footerView = [UIColor greenColor];

    UITextView *textView = [[UITextView alloc] initWithFrame:CGRectInset(footerView.frame, 5, 5)];
    textView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    textView.backgroundColor = [UIColor redColor];

    [footerView addSubview:textView];
    return footerView;

文本视图根本不出现,而不是填充页脚视图(具有 5 磅的边距)。它可能有一个CGRectZero 的框架(或者甚至可能是-5 x -5?)。但是,如果我将 inset 设置为 0、0,它会按预期扩展。

对此有何解释?如果我不能在初始帧中使用 CGRectZero 的插图,那么当无法知道 footerView 的帧时我应该使用什么?

【问题讨论】:

【参考方案1】:

CGRectInset 将基于现有矩形创建一个矩形。它不再引用页脚视图:仅当它计算它这一次时。在这种情况下,由于您试图插入一个大小为零的矩形,这适用于文档:

讨论。 矩形是标准化的,然后插入参数是 应用。如果生成的矩形的高度为负数或 宽度,返回一个空矩形。

因此,您正在使用空矩形创建标签。

我会创建一个“典型”大小的页脚,然后是一个带有你想要的 autoResizingMask 的适当大小的标签,然后 然后 将你的 footerView 设置为零(如果这是你想要的设置) .

【讨论】:

你的最后一句话是正确答案,除了你不需要将框架设置为零。通过表格视图将页脚调整为适当的大小,因此如果您需要边距、布局等,可以选择任意大小。 @jrturton:是的,但他似乎出于某种原因希望它为零,这样做没有害处。 谢谢。是的,不需要将其设置回零,我只是在没有其他任何东西的情况下使用它。【参考方案2】:

我猜想 TextView 在后台创建内容,所以在初始化时它是空的。我通常最终使用[string sizeWithFont:constrainedToSize:lineBreakMode:]

CGSize size = [aString sizeWithFont:[UIFont systemFontOfSize:12.0] constrainedToSize:CGSizeMake(320,500) lineBreakMode:NSLineBreakByWordWrapping];
CGRect frame = CGRectMake(0, 0, size.width, size.height);

【讨论】:

以上是关于将 autoResizingMask 与 CGRectZero 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

UIView的 autoresizingMask意义

autoresizingMask属性

@property(nonatomic) UIViewAutoresizing autoresizingMask;

UIView AutoresizingMask 用于将按钮固定到右下角

关于UIView的autoresizingMask属性的研究

关于UIView的autoresizingMask属性的研究转