У меня проблема, которая меня раздражает, и я не могу объяснить, что происходит. У меня есть UITableView с разными представлениями и 3 ячейки прототипа для выбора. Если я в своем групповом режиме, я покажу прототип applicationCell из моей раскадровки. Первая запись всегда выглядит нормально, но если у меня есть 2, изображение во второй записи удваивается и изменяет размер изображения так, чтобы оно отображалось дважды - в правильном размере и снова изменялось до высоты ячейки (также есть только одно изображение в ячейке), см. Изображение :UIImageView удваивает и меняет размер
Вот соответствующий код, который вызывает проблему:
- (UITableViewCell *)tableView:(UITableView *)table
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if(app == nil && groupedMode) {
UITableViewCell *cell = [table dequeueReusableCellWithIdentifier:@"applicationCell"
forIndexPath:indexPath];
UILabel *head = (UILabel*)[cell viewWithTag:2];
UILabel *badge = (UILabel*)[cell viewWithTag:3];
UILabel *lastMsg = (UILabel*)[cell viewWithTag:4];
UIImageView *imgView = (UIImageView*)[cell viewWithTag:1];
ApplicationEntity *a = [applications objectAtIndex:indexPath.row];
head.text = a.name;
badge.text = [NSString stringWithFormat:@"%lu",(unsigned long)a.messages.count];
ImagesEntity *ie = [ImagesEntity imageByAppId:a.appToken imgId:0];
NSLog(@"V %li",(long)indexPath.row);
//imgView.contentMode = UIViewContentModeScaleAspectFit;
imgView.image = ie.computedImage;
CGRect r = imgView.bounds;
NSLog(@"bounds %f %f %f %f",r.origin.x,r.origin.y,r.size.width,r.size.height);
r = imgView.frame;
NSLog(@"frame %f %f %f %f",r.origin.x,r.origin.y,r.size.width,r.size.height);
imgView.bounds = CGRectMake(0,0,48,48);
imgView.frame = CGRectMake(11,2,48,48);
cell.tag = indexPath.row;
if(cell.gestureRecognizers.count == 0) {
UITapGestureRecognizer * gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(applicationClicked:)];
[cell addGestureRecognizer:gr];
}
lastMsg.text = [dateFormatter stringFromDate:a.lastMessage];
r = imgView.bounds;
NSLog(@"after bounds %f %f %f %f",r.origin.x,r.origin.y,r.size.width,r.size.height);
r = imgView.frame;
NSLog(@"after frame %f %f %f %f",r.origin.x,r.origin.y,r.size.width,r.size.height);
return cell;
}
UIImageView имеет ограничение по ширине = высота = 48. То, что я проверил и выяснил, до сих пор:
- Настройка изображения на ноль показывает отсутствие изображения = нет ошибки
- Не назначать новое изображение не отображается ошибка.
- Назначение нового изображения только один раз работает.
Когда это произойдет, UIImageView получает новые границы и рамку, но устанавливать их непосредственно обратно правильные значения не помогает увидеть журнал
V 0 границы 0,000000 0,000000 48,000000 48,000000 рамка 11,000000 2,000000 48,000000 48,000000 после границ 0.000000 0,000000 48,000000 48,000000 после того, как кадр 11,000000 2,000000 48,000000 48,000000 V 1 границы 0,000000 0,000000 320,000000 110,000000 рама 0,000000 110,000000 320,000000 110,000000 после границ 0,000000 0,000000 48,000000 48,000000 AFTE r рама 11.000000 2.000000 48.000000 48.000000
Высота 110 - высота ячейки и ширина 320. Он нарушает ограничения. Кроме того, изображение, которое я назначаю, имеет размер 96x96 пикселей, поэтому он демонстрирует приятное изображение в HDPI-дисплеях.
Порядок и изображения могут меняться, поэтому мне нужно назначить правильные изображения.
Любые идеи, почему это происходит и как я мог это предотвратить?
(Только совет) Создание переменных для UILabel и UIImageView также является хорошей практикой кодирования imo.Это сделает ваш код более читаемым, и у вас не будет таких проблем. И использование пользовательских ячеек также делает работу более разделенной и чистой. – meth