Mam problem z autolayout w projekcie xcode 5
. Używam zwykłego kontrolera widoku w środku za pomocą kontrolera nawigacyjnego. Mam MKMapView
w górnej połowie i UITableView
w dolnej połowie. Używam storyboards
i skonfigurowałem prototyp UITableViewCell
, ale dodam ograniczenia za pomocą kodu. Podwójnie sprawdziłem każdą kontrolę w prototypie i nie widzę tam żadnych ograniczeń. Mój problem występuje, gdy dodam ograniczenia dla UITableViewCell
. Mam następujący kod w komórkach:Problemy z AutoLayout na UITableViewCell
-(void)updateConstraints {
[super updateConstraints];
//first remove old constraints
[self removeConstraints:self.constraints];
[self.nameLabel removeConstraints:self.nameLabel.constraints];
[self.addressLabel removeConstraints:self.nameLabel.constraints];
[self.rentableSquareFeetLabel removeConstraints:self.rentableSquareFeetLabel.constraints];
[self.lastSaleAmountLabel removeConstraints:self.lastSaleAmountLabel.constraints];
[self.lastSaleDateLabel removeConstraints:self.lastSaleAmountLabel.constraints];
[self.thumbnailImageView removeConstraints:self.thumbnailImageView.constraints];
//then set up constraints
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_thumbnailImageView, _nameLabel, _rentableSquareFeetLabel, _lastSaleAmountLabel, _addressLabel, _lastSaleDateLabel);
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_thumbnailImageView(60)]-[_nameLabel(<=200)]-(>=8)-[_rentableSquareFeetLabel]-(>=8)-[_lastSaleAmountLabel]|" options:0 metrics:nil views:viewsDictionary]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_nameLabel]-(-4)-[_addressLabel]" options:NSLayoutFormatAlignAllLeading metrics:nil views:viewsDictionary]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_lastSaleAmountLabel]-(-4)-[_lastSaleDateLabel]" options:NSLayoutFormatAlignAllLeading metrics:nil views:viewsDictionary]];
}
Dostaję następujące w konsoli debugowania. Wyjątek jest wywoływany przez pierwszą linię addConstraints. Gdybym tylko kontynuować przez te następnie ostatecznie wszystko przedstawia się tak, jak powinno być, jak to wygląda Xcode wybiera się przełamać poprawnego ograniczenia:
2013-09-25 15:07:14.169 PECProperties[32381:a0b] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) (
"<NSIBPrototypingLayoutConstraint:0x9d56c70 'IB auto generated at build time for view with fixed frame' H:|-(0)-[UIImageView:0x9d558f0](LTR) (Names: '|':UITableViewCellContentView:0x9d55620)>",
"<NSIBPrototypingLayoutConstraint:0x9d56d20 'IB auto generated at build time for view with fixed frame' H:[UIImageView:0x9d558f0(60)]>",
"<NSIBPrototypingLayoutConstraint:0x9d56d80 'IB auto generated at build time for view with fixed frame' H:|-(78)-[UILabel:0x9d559e0](LTR) (Names: '|':UITableViewCellContentView:0x9d55620)>",
"<NSLayoutConstraint:0x9d53830 H:[UIImageView:0x9d558f0]-(NSSpace(8))-[UILabel:0x9d559e0]>")
Will attempt to recover by breaking constraint <NSIBPrototypingLayoutConstraint:0x9d56d80 'IB auto generated at build time for view with fixed frame' H:|-(78)-[UILabel:0x9d559e0](LTR) (Names: '|':UITableViewCellContentView:0x9d55620)>
Break on objc_exception_throw to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
Trzeci NSIBPrototypingLayoutConstraint pokazuje 78 punktów pomiędzy krawędzią widzenia oraz etykieta. Właśnie tam prototyp jest z grubsza pozycjonowany (i jeśli poruszę go w prototypie, widzę zmianę ograniczenia w konsoli debugowania), ale to jest w konflikcie z moim własnym ograniczeniem "standardowej" odległości między widokiem obrazu a etykietą .
Próbowałem ustawić translatesAutoresizingMaskIntoConstraints=NO
w kontrolerze widoku cellForRowAtIndexPath
, ale to też nie pomaga. Jak mogę naprawić układ?
Zauważyłem błąd typu "jeden po drugim" w systemie iOS7, który spowodował podobny problem. Podawałem wszystkie ograniczenia w IB i XCode był szczęśliwy. Ale suma wszystkich pionowych rozmiarów w wyjątku
Matt