31

から拡張するカスタム UIButton を作成しようとしていますUIButtonType.RoundedRect

追加した機能は機能していますが、ボタンの最初の丸い境界線の状態に問題があります。拡張ボタンの境界線は、タップされるまで描画されません。

前後のスクリーンショット

更新 (2013 年 1 月 24 日): Richard Marskell の要求に応じて、ボタンのラベルのみが描画されていると結論付ける赤い背景テストの結果を追加しました。BackgroundColor = UIColor.Red;

赤の背景テスト、前後のスクリーンショット

以下は、カスタム ボタンを作成するためのソース コードです。

public class TestView : UIView
{
    public TestView(IntPtr p) : base(p) { }

    public TestView(RectangleF bounds)
    {
        Frame = bounds;
        BackgroundColor = UIColor.White;

        UIButton button1 = new UIButton(UIButtonType.RoundedRect);
        button1.Frame = new RectangleF(20,20,100,50);
        button1.SetTitle("Button 1", UIControlState.Normal);
        AddSubview(button1); // Drawn Correctly

        MyButton button2 = new MyButton();
        button2.Frame = new RectangleF(20,90,100,50);
        button2.SetTitle("Button 2", UIControlState.Normal);
        AddSubview(button2); // Only drawn correctly after Tap

        // EDIT: Added to test Miguel's theory
        UIButton button3 = UIButton.FromType(UIButtonType.RoundedRect);
        button3.Frame = new RectangleF(20,160,100,50);
        button3.SetTitle("Button 3", UIControlState.Normal);
        AddSubview(button3); // Drawn Correctly
    }
}

public class MyButton : UIButton
{
    public MyButton() : base(UIButtonType.RoundedRect) { }
}
  • ビューの読み込み時に境界線を強制的に正しく描画する方法がわかりません。
  • UIButtonType.Custom自分でボタンのスタイルを設定したくないので、type のボタンは必要ありません。
  • デバッグすると、MyButton のタイプが正しく設定されUIButtonType.RoundedRectます。
  • MyButton (button2) の UIButton 基本プロパティは、UIButton インスタンス (button1) のプロパティと一致します。

デバッグ

この問題を解決するにはどうすればよいですか?


更新 (2013 年 1 月 31 日): Herman Schoenfeld は、このバグに対する適切な解決策を提供しました。

4

1 に答える 1

7

これは機能します

public class MyButton : UIButton
{
    public MyButton() : base(UIButtonType.RoundedRect) { }


    public override RectangleF Frame {
        get {
            return base.Frame;
        }
        set {
            var temp = TranslatesAutoresizingMaskIntoConstraints;
            TranslatesAutoresizingMaskIntoConstraints = false;
            var constraints = new [] {
                NSLayoutConstraint.Create(this, NSLayoutAttribute.Width, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 1.0f, value.Width),
                NSLayoutConstraint.Create(this, NSLayoutAttribute.Height, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 1.0f, value.Height)
            };
            AddConstraints(constraints);
            SizeToFit();
            RemoveConstraints(constraints);
            base.Frame = value;
            TranslatesAutoresizingMaskIntoConstraints = temp;
        }
    }
}

これは単なる回避策であり、バグのようです。SizeToFit() は問題を修正し、他のコードはフレームを維持します。

于 2013-01-31T05:52:42.040 に答える