为 navigationItem.titleView layoutSubviews 获取正确的边界

Posted

技术标签:

【中文标题】为 navigationItem.titleView layoutSubviews 获取正确的边界【英文标题】:Get correct bounds for navigationItem.titleView layoutSubviews 【发布时间】:2010-02-03 20:32:11 【问题描述】:

我有一个 UIView 的子类,我已使用以下代码行将其添加为 titleViewnavigationItem

self.navigationItem.titleView = tempview;

很简单。这很好用。我的问题是这个navigationItem 有时会更新rightBarButton(有时没有按钮,有时有一个标准尺寸的按钮,有时有一个更大的按钮)。

我想我可以简单地使用我添加为titleViewtempview 类的layoutSubviews 方法,所以我把它放进去:

-(void)layoutSubviews 
    [super layoutSubviews];
    self.mylabel.frame = self.bounds;

这似乎不起作用,因为在更新 rightBarButton 项目时它没有正确调整标题视图的大小。

我还注意到,一旦边界变小,它们就不会增长,它们只是改变了位置。

我尝试过使用setNeedsLayoutlayoutIfNeeded,但它们只是用不正确的边界“调整”视图。

我还确保 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 获取正确的边界的主要内容,如果未能解决你的问题,请参考以下文章

考试错题

SQL判断字段是不是为空,为NULL

2021-11-26:() 分值为2, (()) 分值为3, ((())) 分值为4, 也就是说,每包裹一层,分数就是里面的分值+1。 ()() 分值为2 * 2, (())() 分值为3 * 2。(

java怎么判断对象为null

码农八荣八耻

pandas把dataframe的数据列转化为索引列实战:单列转化为索引多列转化为复合索引