1

我正在尝试继承 UINavigationBar,并通过在 Interface Builder 中设置导航栏的类在我的 UINavigationController 中使用它。(类似于这个答案:https ://stackoverflow.com/a/10007896/139388 )

当我覆盖 SizeThatFits() 时,导航栏不再出现在我的应用程序中。如果我注释掉覆盖并重新运行应用程序,导航栏会正确显示。

[Register ("MyNavigationBar")]
public partial class MyNavigationBar : UINavigationBar
{
    public MyNavigationBar (IntPtr handle) : base (handle)
    {
    }

    // If I comment out this method, the navigation bar appears properly
    public override SizeF SizeThatFits (SizeF size)
    {
        return base.SizeThatFits (size);
    }
}

现在,我希望覆盖仅返回基本实现的方法不会修改类的行为,但我对 iOS 和 MonoTouch 不够熟悉,无法理解这是否是预期/未定义的行为,以及我能做什么关于它。

我注意到的一些事情:

  • 如果我在 SizeThatFits() 上设置断点,则“size”参数为空(Width=Height=0)。

  • 如果我重写 LayoutSubviews() 并在其上设置断点,那么只要 SizeThatFits() 方法被重写,Bounds 和 Frame 属性就会有有趣的高度(例如 9.035957E-33),但是当 SizeThatFits() 不是时高度是正常的(44)被覆盖。

我正在使用 MonoTouch,我的应用程序在 Xcode 中构建为 Storyboard。

任何帮助表示赞赏,谢谢。

4

1 回答 1

3

显式设置宽度对我来说失败了,但是使用超级视图的宽度值有效:

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

由于我们对 UINavigationBar 的框架或自动调整掩码没有太大影响,因此我对查询超级视图的详细信息感觉不那么粗暴——但如果有人有更好的解决方案,请分享。

于 2013-05-14T03:52:48.807 回答