2013-04-09 13 views
15

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

Odpowiedz

31

będzie trzeba aktualizować ograniczenia jak:

-(void)updateConstraints{ 
// add your constraints if not already there 
[super updateConstraints]; 
} 

Po dodaniu poglądy Superview trzeba zadzwonić [self setNeedsUpdateConstraints] aby zacząć z nich korzystać. W ten sposób środowisko wykonawcze renderowania wywoła updateConstraints we właściwym czasie.

+1

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

+26

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

+0

Myślę, że nie należy wywoływać setNeedsUpdateConstraints tylko w razie potrzeby ... – Adrian

Powiązane problemy