2015-06-14 4 views
2

У меня проблема, которая меня раздражает, и я не могу объяснить, что происходит. У меня есть UITableView с разными представлениями и 3 ячейки прототипа для выбора. Если я в своем групповом режиме, я покажу прототип applicationCell из моей раскадровки. Первая запись всегда выглядит нормально, но если у меня есть 2, изображение во второй записи удваивается и изменяет размер изображения так, чтобы оно отображалось дважды - в правильном размере и снова изменялось до высоты ячейки (также есть только одно изображение в ячейке), см. Изображение :UIImageView удваивает и меняет размер

enter image description here

Вот соответствующий код, который вызывает проблему:

- (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. То, что я проверил и выяснил, до сих пор:

  1. Настройка изображения на ноль показывает отсутствие изображения = нет ошибки
  2. Не назначать новое изображение не отображается ошибка.
  3. Назначение нового изображения только один раз работает.
  4. Когда это произойдет, 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-дисплеях.

Порядок и изображения могут меняться, поэтому мне нужно назначить правильные изображения.

Любые идеи, почему это происходит и как я мог это предотвратить?

+0

(Только совет) Создание переменных для UILabel и UIImageView также является хорошей практикой кодирования imo.Это сделает ваш код более читаемым, и у вас не будет таких проблем. И использование пользовательских ячеек также делает работу более разделенной и чистой. – meth

ответ

0

После некоторого поиска по связанным ответам я нашел хотя бы решение и идею, что произошло.

У табличных ячеек уже есть собственное изображение. И мой код

UIImageView *imgView = (UIImageView*)[cell viewWithTag:1]; 

должен был возвратить мой UIImageView, так как это только один набор с тегом 1. По-видимому, не было. Изменение тега на 10 в раскадровке и код решили. Поэтому я каким-то образом изменил фоновое изображение ячейки.

Странно, что в другом режиме также есть прототипы с изображением в качестве метки 1, и у них нет такой проблемы. Поэтому я все еще не понимаю, почему это происходит, но, по крайней мере, я знаю, как это исправить. Надеюсь, это полезно для других с аналогичными проблемами.

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