为 navigationItem.titleView layoutSubviews 获取正确的边界
Posted
技术标签:
【中文标题】为 navigationItem.titleView layoutSubviews 获取正确的边界【英文标题】:Get correct bounds for navigationItem.titleView layoutSubviews 【发布时间】:2010-02-03 20:32:11 【问题描述】:我有一个 UIView
的子类,我已使用以下代码行将其添加为 titleView
的 navigationItem
:
self.navigationItem.titleView = tempview;
很简单。这很好用。我的问题是这个navigationItem
有时会更新rightBarButton
(有时没有按钮,有时有一个标准尺寸的按钮,有时有一个更大的按钮)。
我想我可以简单地使用我添加为titleView
的tempview
类的layoutSubviews
方法,所以我把它放进去:
-(void)layoutSubviews
[super layoutSubviews];
self.mylabel.frame = self.bounds;
这似乎不起作用,因为在更新 rightBarButton
项目时它没有正确调整标题视图的大小。
我还注意到,一旦边界变小,它们就不会增长,它们只是改变了位置。
我尝试过使用setNeedsLayout
和layoutIfNeeded
,但它们只是用不正确的边界“调整”视图。
我还确保 rightBarButton
项设置为 nil,但视图在缩小后仍无法正确展开。
感谢您的帮助!
【问题讨论】:
【参考方案1】:配置你的视图
[self setAutoresizingMask:UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];
(可能在 initWithFrame 中)
然后实施
- (void)willMoveToSuperview:(UIView *)newSuperview
[self setFrame:[newSuperview bounds]];
现在您的视图与容器的大小匹配,并自动调整大小。
【讨论】:
为什么这没有被标记为正确答案?这是一个很好的提示 - willMoveToSuperview 是关键【参考方案2】:默认情况下,layoutSubviews 什么都不做。您也永远不会更改 titleView 的大小,因此除非导航栏为您这样做,否则没有任何变化也就不足为奇了。
由于您只是更改其中一个子视图的大小,我认为 autoresize 不会起作用,因为我很确定它会在超级视图(启用 autoresizesubviews 的那个)更改大小时触发。我建议在更改右键时重新计算标题视图的大小。如果它在您第一次添加时自动适应,您可以删除并阅读它,但我知道这是一个非常丑陋的 hack。
【讨论】:
【参考方案3】:您是否尝试过设置 autoresizingMask 属性而不是覆盖 -layoutSubviews
?
tempView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
【讨论】:
我试过了,它似乎与layoutSubviews
方法没有什么不同。不过谢谢!以上是关于为 navigationItem.titleView layoutSubviews 获取正确的边界的主要内容,如果未能解决你的问题,请参考以下文章
2021-11-26:() 分值为2, (()) 分值为3, ((())) 分值为4, 也就是说,每包裹一层,分数就是里面的分值+1。 ()() 分值为2 * 2, (())() 分值为3 * 2。(