在自定义UIView类中创建的Xamarin iOS子视图未显示

时间:2017-11-29 20:08:50

标签: uiview xamarin.ios

我有一个自定义的UIView类,我想在其中添加一堆子视图。这应该是一项简单的任务,但我似乎无法弄清楚为什么我的观点没有出现在用户界面上。

这里的示例和教程非常简单,我相信我已经正确实现了我的代码。我在AddSubview添加了一个断点,容器有一个大小。

UIViewController类已经通过故事板添加了背景图像。

有人能帮我看看我可能错过的东西吗?我知道它很小。

以下是我的代码:

自定义视图类

public class RotaryWheel : UIView
{
    int numberOfSections;

  public RotaryWheel(CGRect frame,int sections): base(frame)
    {
       numberOfSections = sections;

       DrawWheel();

    }

  public void DrawWheel()
   {
       // derive the center x and y
          float centerX = (float)(Frame.Width / 2);
          float centerY = (float)(Frame.Height / 2);

        container = new UIView();
        container.Frame = new RectangleF(centerX, centerY, 100, 100);
        container.BackgroundColor = UIColor.White;
        AddSubview(container);
   }
}

我初始化视图的UIViewController

  public partial class HomePageController : UIViewController
  {
      public override void LoadView()
      {
        base.LoadView();

         rotaryWheel = new RotaryWheel(new CGRect(20f, (float)(View.Frame.Height / 2), (float)View.Frame.Size.Width, (float)View.Frame.Height / 2f), 7);
         View.AddSubview(rotaryWheel);

      }

  }

1 个答案:

答案 0 :(得分:1)

首先,请参阅loadView()。正如文档中提到的那样

  

如果要对视图执行任何其他初始化,请在viewDidLoad()方法中执行此操作。

我们永远不应该在LoadView中初始化子视图,因此我尝试将该代码移至viewDidLoad

public override void ViewDidLoad()
{
    base.ViewDidLoad();
    RotaryWheel rotaryWheel = new RotaryWheel(new CGRect(20f, (float)(View.Frame.Height / 2), (float)View.Frame.Size.Width, (float)View.Frame.Height / 2f), 7);
    View.AddSubview(rotaryWheel);
}  

但看起来这样,子视图并没有像预期的那样定位。

enter image description here

将该代码移至ViewDidAppear后,问题就消失了。

public override void ViewDidAppear(bool animated)
{
    base.ViewDidAppear(animated);

    if(rotaryWheel  == null){
        rotaryWheel = new RotaryWheel(new CGRect(20f, (float)(View.Frame.Height / 2), (float)View.Frame.Size.Width, (float)View.Frame.Height / 2f), 7);
        View.AddSubview(rotaryWheel);
    }
}

enter image description here

要点:

View的实际尺寸出现在方法ViewDidAppear中。如果您不使用autoLayout,则应谨慎管理视图Frame

为什么你没有看到子视图,我猜你选择了iphone4,iPhone 5或iPhone5S模拟器进行测试,屏幕宽度为320,你创建了RotaryWheel,X = 20,centerX是300的方法LoadView,因此显示在屏幕外。