Как я могу динамически устанавливать ограничения UIView?

У меня есть пользовательский UITableViewCell. Он содержит метки и UIImageView сверху вниз. Я добавил ограничения для меток и UIImageViews. Итак, я могу использовать systemLayoutSizeFittingSize: UILayoutFittingCompressedSize, чтобы вычислить высоту ячейки, соответствующую содержимому. Но изображение в UIImageView загружается из сети с помощью SDWebImage. Сначала я могу установить некоторые ограничения для UIImageView. Когда изображение загружено, я должен изменить ограничение UIImageView, чтобы оно соответствовало его размеру. Но иногда возникает ошибка. Иногда это нормально:

* Ошибка утверждения в - [NSLayoutConstraint _setSymbolicConstant: constant:], /SourceCache/Foundation_Sim/Foundation-1142.14/Layout.subproj/NSLayoutConstraint.m:585 2015-04-01 19: 57: 44.537 HiPDA [3760: 63583]
*
Завершение работы приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Константа не конечна! Это незаконно. константа: nan '
*** Стек вызовов первого вызова:
(
0 CoreFoundation 0x00000001113cfa75 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000111068bb7 objc_exception_throw + 45
2 CoreFoundation 0x00000001113cf8da + [NSException Raise: format: arguments:] + 106
3 Foundation 0x000000010ef0cb6f - [NSAssertionHandler handleFailureInMethod: object: file: lineNumber: description:] + 195
4 Foundation 0x000000010ee87c7d - [NSLayoutConstraint _setSymbolicConstant: constant:] + 149

Код такой:

__weak typeof(self) weakSelf = self;
__weak typeof(UIImageView *) weakImgView=imgView;
[imgView sd_setImageWithURL:[NSURL URLWithString:[dic objectForKey:THREADLISTDETAILIMAGE]] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

    CGFloat width=image.size.width>maxWidth?maxWidth:image.size.width;
    NSLayoutConstraint *imgW1=[NSLayoutConstraint constraintWithItem:weakImgView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeWidth multiplier:0.0 constant:width];
    [weakSelf.contentView addConstraint:imgW1];
    NSLayoutConstraint *imgH1=[NSLayoutConstraint constraintWithItem:weakImgView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:0.0 constant:width*image.size.height/image.size.width];
    [weakSelf.contentView addConstraint:imgH1];

    [weakSelf needsUpdateConstraints];
    [weakSelf layoutIfNeeded];
    [weakSelf layoutSubviews];
}];

И если изображение загружено полностью, представление таблицы не обновляется. Я вижу, что изображение выходит за пределы размера ячейки. Как я могу это решить?


person leizh00701    schedule 01.04.2015    source источник


Ответы (1)


Вы должны взять Outlet NSLayoutConstraint для imageView и программно изменить значение, например

self.imgViewHeightConstraint.constant = 300 (некоторое значение)

person Uttam Sinha    schedule 01.04.2015
comment
и когда изображение загружено, как вызвать tableview для обновления. первое изображение показывает, когда изображение загружено: rel = "n" forum / w% 3D580 / второе обновление вручную. > imgsrc.baidu.com/forum/w%3D580/ - person leizh00701; 01.04.2015
comment
чтобы обновить весь tableview, вы можете вызвать [tableview reloadData] или для перезагрузки отдельной ячейки вы можете вызвать метод reloadRowsAtIndexPaths:withRowAnimation:, если вы знаете, какой indexPath вы хотите обновить. - person c_rath; 01.04.2015