获取navigationItem.titleView的正确边界布局:layoutSubviews。

4

我有一个UIView的子类,我将它添加为navigationItemtitleView,使用以下代码:

self.navigationItem.titleView = tempview;

很容易。这很好用。我的问题是,有时候这个 navigationItem 会更新 rightBarButton (有时候没有按钮,有时候有一个标准大小的按钮,有时候有一个更大的按钮)。

我想到可以简单地使用我添加为 titleViewtempview 类的 layoutSubviews 方法,所以我加入了以下代码:

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

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

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

我尝试使用setNeedsLayoutlayoutIfNeeded,但这些方法只是用错误的边界“重新调整”了视图。

我还确保将rightBarButton项设置为nil,但视图仍然无法在缩小后正确扩展。

感谢任何帮助!

3个回答

4

使用以下方式配置您的视图:

[self setAutoresizingMask:UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];

(可能是在initWithFrame中)

然后实现

- (void)willMoveToSuperview:(UIView *)newSuperview
{
    [self setFrame:[newSuperview bounds]];
}

现在您的视图已经与容器的大小匹配,并且可以自动调整大小。

为什么这个答案没有标记为正确答案?这是一个很好的提示 - willMoveToSuperview 是关键。 - Aleksandar Vacić

2

默认情况下,layoutSubviews不会做任何事情。您也从未更改过titleView的大小,因此除非导航栏为您执行此操作,否则不会有任何变化。

由于您仅更改了一个子视图的大小,我认为自动调整大小不起作用,因为我非常确定它是在超级视图(启用autoresizesubviews的视图)更改大小时触发的。建议在更改rightbutton时重新计算titleview的大小。如果第一次添加时它自动适合,则可以将其删除并重新添加,但我知道这是一个相当丑陋的hack。


0

你有没有尝试设置autoresizingMask属性,而不是覆盖-layoutSubviews方法?

tempView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

1
我尝试过了,似乎与“layoutSubviews”方法没有任何区别。不过还是谢谢! - mjdth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接