Próbuję użyć autolayout dla podklasy uitableviewcell, którą tworzę i byłbym wdzięczny za poradę, w jaki sposób umieścić kod tworzenia ograniczeń układu. Przeszukiwałem i wszystkie informacje, które znajduję mówi o dodawaniu ograniczeń po dodaniu subviews w metodzie viewDidLoad. O ile wiem, viewDidLoad nie jest opcją dla podklasy uitableviewcell.gdzie utworzyć ograniczenia autolayout dla subklassed uitableviewcell?
Używam kreatora interfejsów do tworzenia niestandardowej komórki i dynamicznego przydzielania jej w moim kodzie. Nic specjalnego ... Podklasuję komórkę uitableview, więc mogę dodać niestandardowy interfejs do komórki. Ponownie, nic szczególnie Ziemi się nie psuje ... Moja trudność przychodzi, kiedy próbuję ustawić mój niestandardowy uiview w odniesieniu do etykiety dodanej do komórki w programie budującym interfejs.
Jest to kod, aby utworzyć niestandardowe UIView i dodać go do komórki Treści:
- (id)initWithCoder:(NSCoder *)decoder
{
if ((self = [super initWithCoder:decoder]))
{
[self initSelf];
}
return self;
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]))
{
[self initSelf];
}
return self;
}
- (void) initSelf
{
// Initialization code
_badgeLabel = @"";
if (!_customBadge)
{
_customBadge = [CustomBadge customBadgeWithString:self.badgeLabel];
}
// hide the badge until needed
self.customBadge.hidden = YES;
// add badge to the cell view hierarchy
[self.customBadge setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.customBadge setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal];
[self.customBadge setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisVertical];
[self.contentView addSubview:self.customBadge];
}
Jeśli mogę umieścić kod ograniczeń, w końcu initSelf nic się nie dzieje. Pozycja mojego _customBadge pozostaje na swoim "domyślnym". Po umieszczeniu kodu ograniczenia w layoutSubviews pozycjonowanie zostanie zastosowane; ale jestem prawie pewien, że to złe miejsce. Oto kod:
- (void) layoutSubviews
{
[self.contentView addConstraint:[NSLayoutConstraint
constraintWithItem:self.customBadge
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.competence
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:-14.0]];
[self.contentView addConstraint:[NSLayoutConstraint
constraintWithItem:self.customBadge
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.competence
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:0.0]];
[super layoutSubviews];
}
Czy ktoś może mi powiedzieć, gdzie powinien iść ten kod? Z pewnością tworzę powielone ograniczenia za każdym razem, gdy układ się dzieje.
Dzięki
Dokumentacja (https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/occ/instm/UIView/updateConstraints) mówią, "Zadzwoń [super updateConstraints] jako ostatni krok w twojej implementacji. ". – cnotethegr8
Ale czy ponownie dodaje te same ograniczenia za każdym razem, gdy wywoływana jest funkcja updateConstraints? Czy najlepiej usunąć uprzednio dodane ograniczenia przed ich ponownym dodaniem? Czy system iOS jest wystarczająco mądry, aby rozpoznać, że ograniczenie, które dodajesz, już istnieje i nie dodaje go ponownie? – PapillonUK
Myślę, że nie należy wywoływać setNeedsUpdateConstraints tylko w razie potrzeby ... – Adrian