2016-12-16 2 views
0

Решение для центрирования любого поднабора в родительском объекте обычно прост, однако оно, похоже, не работает в моем случае.Xamarin iOS: центр UILabel внутри UICollectionView Header, созданный программно

Я работаю с UICollectionView и добавил класс заголовка программно. У меня этот конструктор, где я также пытаюсь центрировать метку в пределах экрана:

[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 «s так:

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

+0

Если вы показываете только ярлык, вы можете рассмотреть возможность его полной ширины и установить выравнивание текста в центр. –

+0

У меня на самом деле две кнопки, представляющие стрелки вперед и назад слева и справа от этой метки. В настоящее время они закомментированы, потому что я все еще не могу сосредоточить ярлык. Таким образом, они также неправильно расположены. – naffie

ответ

0

я нашел объяснение здесь iOS Layout Gotchas Адам Кемп, который помог мне решить эту проблему.

Первое решение

Одна очень распространенная ошибка, я сделал добавлял код определения макета в конструкторе, вместо того, чтобы делать это в законном месте: LayoutSubviews переопределение в этом случае.

Давая метку, размер кадра в конструкторе предполагает статический размер, заданный во время построения, который может впоследствии измениться в зависимости от размера экрана.

Второе решение

Он объясняет, что:

Рама устанавливает положение зрения в пределах своего родителя, а 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); 

    } 
Смежные вопросы