【问题标题】:Get correct bounds for navigationItem.titleView layoutSubviews为 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,但视图在缩小后仍无法正确展开。

感谢您的帮助!

【问题讨论】:

    标签: iphone objective-c cocoa-touch uinavigationitem titleview


    【解决方案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 方法没有什么不同。不过谢谢!
      猜你喜欢
      • 2012-07-16
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多