Я использую заголовок (дополнительный вид) в моем файле UICollectionView
. На заголовке у меня есть ярлык, который находится на определенном расстоянии от левой стороны. Я делаю свой расчет и устанавливаю константу ограничения. Все работает так, как ожидалось.
Если ориентация теперь изменена, метки занимают старое положение. Теперь мне нужно обновить ограничения для всех моих заголовков. Вызов invalidateLayout
не обновляет ограничения. Как я могу вручную запустить пересчет?
Изменить:
Вот так выглядит мой layoutSubviews
, где происходит пересчет:
public override void LayoutSubviews ()
{
this.width = this.collectionViewSize.Width;
this.itemWidth = (nfloat)Math.Round(this.width / numberOfItemsInRow);
leftSpacing.Constant = this.itemWidth * this.referencePoint;
if (leftSpacing.Constant == 0)
leftSpacing.Constant = SectionHeader.MIN_SPACING;
base.LayoutSubviews ();
}
Как видите, это не Objective-C, но вы должны видеть, что я делаю. Я беру ширину представления коллекции (устанавливается при создании экземпляра дополнительного представления), а затем вычисляю ширину ячейки, которая почти соответствует реальному размеру ячеек. С помощью referencePoint я определяю позицию. Здесь вы можете увидеть настройку моих ограничений:
public SectionHeader (CGRect frame) : base (frame)
{
this.width = frame.Size.Width;
this.itemWidth = (nfloat)Math.Round(width / numberOfItemsInRow);
label = new UILabel (){
BackgroundColor = UIColor.White,
TextAlignment = UITextAlignment.Left
};
label.TranslatesAutoresizingMaskIntoConstraints = false;
AddSubview (label);
NSMutableDictionary viewsDictionary = new NSMutableDictionary();
viewsDictionary["label"] = label;
this.AddConstraints(NSLayoutConstraint.FromVisualFormat("V:|[label]|",(NSLayoutFormatOptions)0,null,viewsDictionary));
leftSpacing = NSLayoutConstraint.Create(label, NSLayoutAttribute.Left, NSLayoutRelation.Equal, this, NSLayoutAttribute.Left, 1, SectionHeader.MIN_SPACING);
leftSpacing.Priority = 250;
this.AddConstraint(leftSpacing);
this.AddConstraint(NSLayoutConstraint.Create(label, NSLayoutAttribute.Right, NSLayoutRelation.Equal, this, NSLayoutAttribute.Right, 1, 0));
}
В этом коде вычисление расстояния слева почти такое же, за исключением того, что frame имеет высоту множества headerReferenceSize
. Ширина должна быть в порядке для инициализации. Я использую полную высоту для метки, устанавливаю начальное пространство и закрепляю ее справа.