2015-04-01 1 views
1

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

* отказ Assertion в - [NSLayoutConstraint _setSymbolicConstant: постоянная:], /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: Формат: аргументы :] + 106
3 Фундамент 0x000000010ef0cb6f - [NSAssertionHandler handleFailureInMethod: объект: файл: LineNumber: описание:] + 195
4 Фонд 0x000000010ee87c7d - [NSLayoutConstraint _setSymbolicConstant: постоянная:] + 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]; 
}]; 

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

ответ

2

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

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

+1

и когда изображение загружается, как назвать tableview для обновления. первое изображение отображается при загрузке изображения: http: //imgsrc.baidu.com/forum/w%3D580/sign=a7990bbd69224f4a5799731b39f69044/70fea018367adab45f8f66d88fd4b31c8601e431.jpg второе обновление вручную: http: //imgsrc.baidu.com/forum/w% 3D580/sign = eef4736c9b3df8dca63d8f99fd1072bf/1c09d61f3a292df57ec5d18eb8315c6035a8730a.jpg – leizh00701

+1

, чтобы иметь полное обновление таблицы, вы можете вызвать '[tableview reloadData]' или для перезагрузки отдельной ячейки вы можете вызвать метод reloadRowsAtIndexPaths: withRowAnimation: ', если вы знаете, какой indexPath вы хотите обновить. –