У меня проблема с добавлением NSLayoutConstraint. Я хотел бы обновить высоту UICollectionView, чтобы все ячейки вписывались в UICollectionView без прокрутки. Это связано с тем, что я поместил UICollectionView в UIScrollView вместе с другими элементами пользовательского интерфейса.Ограничения автоопределения: Не удается одновременно удовлетворить ограничениям
Я установил ограничения в построителе интерфейса, и я изменяю размер UICollectionView на viewDidLoad, когда знаю, сколько элементов должно отображаться. Я делаю это с
[self allBooksCollectionViewSetConstraints];
Я поставил
[allBooksCollectionView setTranslatesAutoresizingMaskIntoConstraints:NO];
Это мой код
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation) fromInterfaceOrientation {
[self allBooksCollectionViewConstraints];
}
-(NSInteger)allBooksCollectionViewHeight
{
float booksPerRow;
if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation))
{
booksPerRow = 6.0;
}
if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation))
{
booksPerRow = 8.0;
}
//calculate right height do display all cells
NSInteger cvHeight = (ceil((float)[allBooksCollectionView numberOfItemsInSection:0]/booksPerRow)*200.0)+49.0;
return cvHeight;
}
-(void)allBooksCollectionViewSetConstraints
{
NSInteger cvHeight = [self allBooksCollectionViewHeight];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@"V:[view(%d)]", cvHeight] options:0 metrics:nil views:@{@"view":allBooksCollectionView}]];
}
Я попытался удалить ограничения UICollectionView из UIScrollView, но это не меняет вещь.
[scrollView removeConstraints:allBooksCollectionView.constraints];
Об изменении ориентации я получаю следующее сообщение об ошибке:
Unable to simultaniously satisfy constraints ... (
"<NSLayoutConstraint:0x9aa49f0 V:[UICollectionView:0xc0b6000(849)]>",
"<NSLayoutConstraint:0xb2b15d0 V:[UICollectionView:0xc0b6000(1049)]>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0xb2b15d0 V:[UICollectionView:0xc0b6000(1049)]>
Но другое ограничение должно быть сломаны! Не этот, потому что 1049 - cvHeight.
Как это исправить?
следует добавлять только ограничения в updateConstraints или updateViewConstraints –