iphone - 如何让 layoutSubviews 在 sizeThatFits 之前被调用?

标签 iphone ios cocoa-touch uiview

当我在我的一个 View 上调用 sizeToFit 时,我注意到 iOS 框架首先调用 sizeThatFits,然后在该 View 上调用 layoutSubviews。这对我来说是有问题的,因为我的 sizeThatFits 中的计算取决于我的 layoutSubviews 的结果。在下面的示例中, subview 在 layoutSubviews 中得到调整,并且此 subview 的高度在 sizeThatFits 中使用。目前我的代码无法正常工作,顺序已颠倒。

在我的 View Controller 的 viewDidLoad 中:

UIView* header = [[MyHeader alloc] init];
[header sizeToFit];
self.tableView.tableHeaderView = header;
[header release];

在我看来:

- (void) layoutSubviews {
    [super layoutSubviews];
    [self.subView sizeToFit];
}

- (CGSize) sizeThatFits:(CGSize)size {
    return CGSizeMake(
        self.frame.size.width,
        self.subView.frame.size.height
    );
}

最佳答案

您会希望您的 View 始终做正确的事 (tm),无论您以何种顺序调用事物。为此,我建议将计算 View 和 subview 所需高度的代码放在一个单独的方法中。沿着这些线的东西:

- (void)updateSubviewDimensions
{
    [self.subview sizeToFit];
    // possibly much more code
}

- (void) layoutSubviews {
    [super layoutSubviews];
    [self updateSubviewDimensions];
}

- (CGSize) sizeThatFits:(CGSize)size {
    [self updateSubviewDimensions];
    return CGSizeMake(
        self.frame.size.width,
        self.subView.frame.size.height
    );
}

这样,您就不需要记住在调用 sizeToFit 之前调用某个方法,但您的 View 将始终按您的意愿行事。此外,当您在几个月后查看(或让不同的开发人员查看)时,您的代码不那么脆弱且更容易理解。

关于iphone - 如何让 layoutSubviews 在 sizeThatFits 之前被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12148421/

相关文章:

ios - nibBundleOrNil 返回包的名称和消息 "(not yet loaded)"意味着什么?

ios - 如何获得给定值在 UISlider 中的位置?

iphone - UIView "suck"动画

iphone - 触摸移动时的贝塞尔曲线示例代码

iphone - UITableViewCell imageView.contentMode 在 3.0 中不起作用

iphone - UITableView 和 Core Data 的多对多关系

iphone - 错误#import "PGPlugin.h"in phonegap on lion mac

ios - 如何获得像 “mm:ss”格式的歌曲的实际持续时间?

iphone - 从我的应用程序启动浏览器

ios - UIBezierPath 删除问题