将父视图中的任何子视图居中的解决方案通常很简单,但是,在我的情况下似乎不起作用。
我正在使用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);
}
}
我到底错过了什么,因为这通常适用于其他情况,但似乎在这里失败了?
答案 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);
}