gpt4 book ai didi

ios - sizeToFit 依赖 layoutSubviews 如何实现?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:00:51 25 4
gpt4 key购买 nike

layoutSubviews 的文档中,苹果说:

You should not call this method directly.

我正在尝试实现 sizeToFit。我希望它在所有 subview 上放置一个紧密的边界框。在确定这样的边界框之前,我必须布局 subview 。这意味着我必须调用 layoutSubviews,Apple 对此不以为然。我如何在不违反 Apple 规则的情况下解决这个难题?

- (void)layoutSubviews
{
[super layoutSubviews];

self.view0.frame = something;
self.view1.frame = somethingElse;
}

- (void)sizeToFit
{
[self layoutSubviews];

self.frame = CGRectMake(
self.frame.origin.x,
self.frame.origin.y,
MAX(
self.view0.frame.origin.x + self.view0.frame.size.width,
self.view1.frame.origin.x + self.view1.frame.size.width
),
MAX(
self.view0.frame.origin.y + self.view0.frame.size.height,
self.view1.frame.origin.y + self.view1.frame.size.height
)
);
}

最佳答案

不应覆盖 -sizeToFit。而是用 View 的当前边界大小覆盖 -sizeThatFits:,它由 -sizeToFit 在内部调用。

You should not override this method. If you want to change the default sizing information for your view, override the sizeThatFits: instead. That method performs any needed calculations and returns them to this method, which then makes the change. – UIView Class Reference


另外,即使您要覆盖 -sizeToFit,也很可能没有理由立即执行布局。您只需调整 View 的大小,即设置其边界大小。这会触发对 -setNeedsLayout 的调用,将 View 标记为需要布局。但是,除非您想为 View 设置动画,否则不必立即应用新布局。

这种延迟更新模式的要点在于,如果您执行多个连续更新,它会节省大量时间,因为实际更新只执行一次。


我通常这样做。它就像一个魅力。

#pragma mark - Layout & Sizing

- (void)layoutSubviews
{
[self calculateHeightForWidth:self.bounds.size.width applyLayout:YES];
}

- (CGSize)sizeThatFits:(CGSize)size
{
CGFloat const width = size.width;
CGFloat const height = [self calculateHeightForWidth:width applyLayout:NO];

return CGSizeMake(width, height);
}

- (CGFloat)calculateHeightForWidth:(CGFloat)width applyLayout:(BOOL)apply
{
CGRect const topViewFrame = ({
CGRect frame = CGRectZero;
...
frame;
});

CGRect const bottomViewFrame = ({
CGRect frame = CGRectZero;
...
frame;
});

if (apply) {
self.topView.frame = topViewFrame;
self.bottomView.frame = bottomViewFrame;
}

return CGRectGetMaxY(bottomViewFrame);
}

请注意,示例代码适用于可以以任何宽度显示的 View ,并且容器会询问特定宽度的首选高度。

虽然可以很容易地调整其他布局样式的代码。

关于ios - sizeToFit 依赖 layoutSubviews 如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29287431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com