Xamarin iOS:以编程方式创建的UICollectionView Header中的UILabel中心

时间:2016-12-16 19:40:37

标签: xamarin.ios uicollectionview

将父视图中的任何子视图居中的解决方案通常很简单,但是,在我的情况下似乎不起作用。

我正在使用UICollectionView并以编程方式添加了一个Header类。我有这个构造函数,我也尝试将标签置于屏幕中心:

 [Export("initWithFrame:")]
    public Header(System.Drawing.RectangleF frame) : base(frame)
    {
        label = new UILabel
        {
            Frame = new System.Drawing.RectangleF(frame.Size.Width / 2, 50, 200, 50),
            BackgroundColor = UIColor.Clear,
            TextColor = UIColor.White,
            Font = UIFont.FromName("HelveticaNeueLTStd-ThCn", 35f),
            Text = DateTime.Now.ToString("Y")
        };

                AddSubview(label);
    }

我在UICollectionViewSource的构造函数中初始化类,如下所示:

  public MyCollectionViewDataSource(MainController mainController, DateTime currentDate)
    {
        try
        {

            controller = mainController;

        new Header(new RectangleF(0, 0, (float)mainController.View.Frame.Size.Width, 200));

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message + ex.StackTrace);

        }

    }

我到底错过了什么,因为这通常适用于其他情况,但似乎在这里失败了?

这就是它的样子: Still positioned at the edge of my screen

1 个答案:

答案 0 :(得分:0)

我在Adam Kemp找到了iOS Layout Gotchas的解释,帮助我解决了这个问题。

第一个解决方案

我犯的一个非常常见的错误是在构造函数中添加了布局定义代码,而不是在正确的位置执行:在这种情况下 LayoutSubviews 覆盖。

在构造函数中为标签指定框架大小假设在构造时设置了静态大小,这可能会随后根据屏幕大小而变化。

第二个解决方案

他解释说:

  

Frame 设置视图在其父级内的位置,而 Bounds 位于视图本身(不是其父级)的坐标系中。

所以,为了使UILabel居中,我使用了边界并集中在一起,这对我有用。

  [Export("initWithFrame:")]
    public Header(CGRect bounds) : base(bounds)
    {
        label = new UILabel
        {
            BackgroundColor = UIColor.Clear,
            TextColor = UIColor.White,
            Font = UIFont.FromName("HelveticaNeueLTStd-ThCn", 35f),
            Text = DateTime.Now.ToString("Y"),
            TextAlignment = UITextAlignment.Center

        };

        rectangle = bounds;

        AddSubview(label);

    }




   public override void LayoutSubviews()
    {
        base.LayoutSubviews();

        label.Bounds = new CGRect (rectangle.Size.Width / 2, 50, 200, 50);
        label.Center = new PointF((float)rectangle.Size.Width/2,50);

    }