Ich habe Probleme mit Auto-Layout auf einem xcode 5
Projekt. Ich verwende einen Plain View Controller mit einem Navigationscontroller. Ich habe eine MKMapView
auf der oberen Hälfte und eine UITableView
auf der unteren Hälfte. Ich verwende storyboards
und habe den Prototyp UITableViewCell
konfiguriert, aber ich füge die Einschränkungen durch Code hinzu. Ich habe jede Kontrolle im Prototyp überprüft und sehe keine dort konfigurierten Einschränkungen. Mein Problem tritt auf, wenn ich die Einschränkungen für die UITableViewCell
hinzufügen. Ich habe den folgenden Code in den Zellen:Problem mit AutoLayout auf 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]];
}
Ich bekomme Folgendes in der Debugging-Konsole. Die Ausnahme wird durch die erste addConstraints-Zeile ausgelöst. Wenn ich nur durch diejenigen, weiterhin dann schließlich alles zeigt sich, wie es sein sollte, wie es aussieht wie Xcode ist die Wahl der richtigen Zwang zu brechen:
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.
Die dritte NSIBPrototypingLayoutConstraint zeigt 78 Punkte zwischen dem Rand der Ansicht und eine Etikette. Dort ist der Prototyp grob positioniert (und wenn ich ihn in den Prototyp verschiebe, sehe ich die Änderung in der Constraint in der Debugging-Konsole), aber das widerspricht meiner eigenen Einschränkung des "Standard" -Distanzes zwischen der Bildansicht und dem Label .
Ich habe versucht, die translatesAutoresizingMaskIntoConstraints=NO
in der Ansicht Controller cellForRowAtIndexPath
zu setzen, aber das scheint auch nicht zu helfen. Wie kann ich das Layout reparieren?
Ich bemerkte einen off-by-one Fehler in iOS7, der ein ähnliches Problem verursachte. Ich habe alle Beschränkungen in IB spezifiziert und XCode war glücklich. Aber die Summe aller vertikalen Größen in der Ausnahme
Matt