1

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() でブレークポイントを設定すると、「サイズ」パラメーターは空になります (幅 = 高さ = 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 に答える