覆盖SizeThatFits() - MonoTouch时,自定义UINavigationBar消失

时间:2012-08-10 05:19:12

标签: xamarin.ios uinavigationbar

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

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

[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),但高度是正常的(44)当SizeThatFits()没有被覆盖时。

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

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:3)

对我来说明确设置宽度失败,但是使用superview的宽度值:

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

由于我们对UINavigationBar的框架或自动调整遮罩没有太大影响,因此我对查询超级视图的细节感觉不那么重要 - 但如果有人有更好的解决方案,请分享。