@quard

UIImageView в UITableView «летает» слева направо?

Делаю что-то вроде чата. Мне надо рисовать красивые «облака» как в приложении Messages. Все бы ничего, но когда на экране появляются до этого невидимы ячейки, фон вылетает слева направо.


Сначала думал, что frame задается после добавления view, но оказалось что все ок.


Код таблицы:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    IKChatMessageData *data = [_messages objectAtIndex:indexPath.row];  
    IKChatMessageCell *cell = [[IKChatMessageCell alloc] init];
	
    [cell setData:data];
    
    return cell;
}



Код setData у IKChatMessageCell:

- (void)setData:(IKChatMessageData *)data
{
    _data = data;
    self.selectionStyle = UITableViewCellSelectionStyleNone;
    
    IKChatMessageType type = _data.type;
    
    CGFloat width = _data.view.frame.size.width;
    CGFloat height = _data.view.frame.size.height;
    
    CGFloat x = (type == MessageTypeOther) ? 0 : self.frame.size.width - width - self.data.insets.left - self.data.insets.right;
    CGFloat y = 0;
    
    if (!self.backgroundImage)
    {
        self.backgroundImage = [[UIImageView alloc] init];
    }
    
    if (type == MessageTypeOther)
    {
        self.backgroundImage.image = [[UIImage imageNamed:@"bubbleSomeone.png"] stretchableImageWithLeftCapWidth:21 topCapHeight:14];
        
    }
    else {
        self.backgroundImage.image = [[UIImage imageNamed:@"bubbleMine.png"] stretchableImageWithLeftCapWidth:15 topCapHeight:14];
    }
    
    self.backgroundView.frame = CGRectMake(x, y, width + self.data.insets.left + self.data.insets.right, height + self.data.insets.top + self.data.insets.bottom);

    
    _data.view.frame = CGRectMake(x + self.data.insets.left, y + self.data.insets.top, width, height);
    [_data.view removeFromSuperview];

    [self addSubview:self.backgroundImage];
    [self addSubview:_data.view];
}



Это куски переписанного кода из UIBubbleTableView, там эта проблема тоже есть, но после переписывания, ничего не помогло.
  • Вопрос задан
  • 3354 просмотра
Решения вопроса 1
Flanker_4
@Flanker_4
В этом коде много ошибок, начиная с инициализации
IKChatMessageCell *cell = [[IKChatMessageCell alloc] init]; //приведет к нехватке памяти
И заканчивая
CGFloat x = (type == MessageTypeOther)? 0: self.frame.size.width — width — self.data.insets.left — self.data.insets.right;//чему будет равен self.frame.size.width не ясно в этот момент

Мой Вам совет — найдите нормальный пример с бублами (их на самом деле ну очень много) и просто используйте его.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Flanker_4
@Flanker_4
1) В чате может быть очень много сообщений. К тому же в каждей ячейке у Вас присутсвует UIImageView с картинкой бабла (хотя возможно UIImage и кэшируется) далеко не 10х10 пикселей (+ ретина). А еще приложение могут запустить после какого-то айосовского фаркрая, когда свободной памяти у системы будет очень мало. Лучше все таки использовать reuse там где это возможно. Ну да ладно.
2) Да, будет, но только после того, как ячейка станет частью таблицы (а это точно произойдет после return в методе делегата, если там нет никакой магии в init cell'a). А на этапе setDate — это просто ячейка, существующая в памяти. Сейчас наверное нет проблем из-за того, что у Вас выставленны autoresizingMask на растягивание. Попробуйте перенести код, отвечающий за формирование размеров бабла в метод делегата willDisplay, возможно это решит проблему.
Но лучше прислушайтесь к моему предыдущему совету.
Есть еще вариант, что Вы выложите проект-пример, воспроизводящий проблему, ведь сейчас слишком много скрыто: среди прочего не ясно как формируется data, а там много значений размеров. Но мне не очень хочется ковыряться в Вашем коде :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы