1

У меня проблема с добавлением 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.

Как это исправить?

+0

следует добавлять только ограничения в updateConstraints или updateViewConstraints –

ответ

1

I have tried removing the UICollectionView constraints from the UIScrollview, but it doesn't change a thing.

[scrollView removeConstraints:allBooksCollectionView.constraints]; 

Эта строка кода является неправильным. Ни одно из ограничений, возвращенных с collectionView.constraints, не будет отображаться в прокрутке, поэтому этот вызов ничего не сделает. Вы должны хранить ограничения, которые вы заботитесь о в переменной собственности или например:

if (collectionViewHeightConstraints) 
{ 
    [scrollView removeConstraints:collectionViewHeightConstraints]; 
} 
collectionViewHeightConstraints = [NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@"V:[view(%d)]", cvHeight] options:0 metrics:nil views:@{@"view":allBooksCollectionView}]; 
[scrollView addConstraints:collectionViewHeightConstraints]; 
+0

Спасибо, чувствую, что это получит меня где-то. У меня есть некоторые проблемы, реализующие вашу линию с помощью collectionViewHeightConstraints = [Ограничения NSLayoutConstraintWithVisualFormat: ...]; хоть. Я получаю предупреждение о Несовместимых типах указателей, назначающих NSlayoutConstraint из NSArray. – Mathijs

+0

Проблема была такой, как вы сказали, ограничения были установлены на UICollectionView, а не на UIScrollView. Чтобы удалить их, я использую [allBooksCollectionView removeConstraints: allBooksCollectionView.constraints]; теперь и для их установки я использую [allBooksCollectionView addConstraints: [NSLayoutConstraint .... Спасибо! – Mathijs

+0

В моем примере кода collectionViewHeightConstraints является NSArray. – jrturton

Смежные вопросы