0

Я пытаюсь создать приложение чата, в котором я создал пользовательский UITableViewCell, используя только код. Таким образом, это похоже на пузырь с метками «Имя», «сообщение» и «Время» внутри пузыря в том же порядке. Метка названия должна составлять половину общей ширины пузыря, а ширина пузыря определяется шириной сообщения, максимальная ширина которого равна 220,0f, после чего она перейдет к следующей строке.Изменение значения константы ограничения ширины UITableViewCell для каждого экземпляра

Проблема, с которой я столкнулась, заключается в следующем: я пытаюсь изменить константу ограничения ширины метки имени в соответствии с шириной сообщения. Но так как iOS повторно использует ячейку, когда я просматриваю свой UITableView, некоторые из ширины ярлыка имени становятся испорченными. Он пытается использовать старую ширину, и поэтому имя метки выходит из пузырька, если имя достаточно велико.

Я прилагаю некоторые изображения, чтобы продемонстрировать, что:

Правильной шириной Имени метки http://postimg.org/image/yd6z2jdft/c1f192cd/

Неправильной ширину Имени метки из-за свиток http://postimg.org/image/u0m7pc8uh/cd7ea4ea/

Вот код, я использую. Я отправляю только соответствующая часть

cellforrowatindexpath:

chatCell = (ChatTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"chatSend"]; 

     if (chatCell == nil) 
     { 
      chatCell = [[ChatTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"chatSend"]; 
     } 

     chatCell.chatMessageLabel.text = message.getMessage; 

     chatCell.chatNameLabel.text = message.getFromName; 

chatCell.chatTimeLabel.text = [dateFormatter stringFromDate:messageDateTime]; 

[chatCell setChatNameLabelWidth:Messagesize.width]; 

Heightforrowatindexpath:

Messagesize = [message.getMessage boundingRectWithSize:CGSizeMake(220.0f, CGFLOAT_MAX) 
                options:NSStringDrawingUsesLineFragmentOrigin 
               attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:14]} 
                context:nil].size; 

ChatTableViewCell.m

в расширении класса

@property (nonatomic, strong) NSLayoutConstraint *chatNameLabelWidthConstraint; 

Способ инициализации

horizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-16-[chatNameLabel]" options:NSLayoutFormatDirectionLeftToRight metrics:nil views:NSDictionaryOfVariableBindings(chatNameLabel)]; 


    [Main addConstraints:horizontal]; 

    // //////////////////////////////////////////////////////////////////////////////////////////// 

    //Setting width constraint for chatNameLabel 

    chatNameLabelWidthConstraint = [NSLayoutConstraint constraintWithItem:chatNameLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.f constant:64.0f]; 

    [chatNameLabel addConstraint:chatNameLabelWidthConstraint]; 

    // //////////////////////////////////////////////////////////////////////////////////////////// 


    //Setting the constraints for chatNameLabel. It should be at 16 distance from right and left of superview, i.e., Main and 8 distance from top and chatMessageLabel which is at 8 distance from chatTimeLabel which is at 8 distance from bottom of superview. 



    vertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[chatNameLabel]-8-[chatMessageLabel]-8-[chatTimeLabel]-8-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(chatNameLabel,chatMessageLabel,chatTimeLabel)]; 

    [Main addConstraints:vertical]; 

Другой метод, чтобы установить ширину

- (void)setChatNameLabelWidth:(CGFloat) messageWidth 
{ 
    CGFloat chatNameLabelWidth; 

    if((messageWidth + 32.0f)<128.0f) 
    { 
     chatNameLabelWidth = 64.0f; 
    } 
    else 
    { 
     chatNameLabelWidth = (messageWidth + 32.0f)/2; 
    } 

    chatNameLabelWidthConstraint.constant = chatNameLabelWidth; 

    [chatNameLabel layoutIfNeeded]; 
} 

ответ

1

Наконец, я решил его с помощью пропорциональной ширины. Если ограничение используется, то это будет получить перепутано, но с использованием пропорциональной ширины вместе с обниматься содержания и приоритетов сопротивления сжатия контента, должны решить эту проблему легко:

Это, как я это сделал:

NSLayoutConstraint *proportionalWidth = [NSLayoutConstraint constraintWithItem:chatNameLabel 
                 attribute:NSLayoutAttributeWidth 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:Main 
                 attribute:NSLayoutAttributeWidth 
                 multiplier:.5 
                  constant:0]; 

    proportionalWidth.priority = 750; 


    [Main addConstraint:proportionalWidth]; 

    [chatNameLabel setContentCompressionResistancePriority:250 forAxis:UILayoutConstraintAxisHorizontal]; 
Смежные вопросы