【问题标题】:Custom UINavigationBar sizeThatFits implementation not returning real frame.size.width自定义 UINavigationBar sizeThatFits 实现不返回真实的 frame.size.width
【发布时间】:2012-12-04 15:38:57
【问题描述】:

我正在尝试使用定义的高度继承 UINavigationBar 并尝试实现 sizeThatFits 方法:

@implementation NavigationBar

- (CGSize)sizeThatFits:(CGSize)size {
    NSLog(@"frame: %@", NSStringFromCGRect(self.frame));
    return CGSizeMake(self.frame.size.width, 62);
}

@end

但显然self.frame.size.width 总是返回一个奇怪的值,它不是我想要的 1024,它导致了下面显示的行为:

NSLog 输出:

> frame: {{224, 20}, {576, 62}}

在手动定义CGSizeMake(1024, 62) 时,这将导致以下情况:

隐藏按钮,NSLog 输出将是:

> frame: {{-128, 20}, {1280, 62}}

关于如何正确实现此方法以使导航栏延伸到所有窗口的任何想法?

【问题讨论】:

    标签: ios resize ios6 uinavigationbar subclassing


    【解决方案1】:

    如果你想避免使用“幻数”,可以尝试使用UINavigationBar superview 的大小。

    - (CGSize)sizeThatFits:(CGSize)size
    {
        return CGSizeMake(self.superview.bounds.size.width, 62.0f);
    }
    

    在 iOS 6 上非常适合我。无需覆盖 layoutSubviews

    【讨论】:

    • 当方向改变时需要添加什么才能工作?
    • @RandyHunt 似乎什么都不需要。 iOS 会自动在旋转时查询此尺寸。
    • 因此,请致电[super sizeThatFits:size]; return self.superview.bounds.size; ?!
    【解决方案2】:

    同时使用layoutSubviewssizeThatFits 似乎有效:

    - (CGSize)sizeThatFits:(CGSize)size {
        return CGSizeMake(1024, 62);
    }
    
    - (void)layoutSubviews {
        [super layoutSubviews];
        self.frame = CGRectMake(0, 20, 1024, 64);
    }
    

    【讨论】:

    • 嗨,利亚姆,我以前试过。 layoutSubview 不会考虑导航栏的高度,它只会覆盖栏下方的内容,而不是应用正确的空间。
    • 感谢利亚姆,我想我发现了一些可能有效的方法,但这只是因为您最初的帮助:),如果您对它感到满意,您可以编辑您的答案,我会将其标记为正确。我所做的是这个(pastebin.com/X5svpW7s)。所以我不得不实现这两种方法。欢呼
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多