Изменение постоянного значения ограничения ширины UITableViewCell для каждого экземпляра

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

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

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

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

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

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

путь к ячейке по индексу:

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];

Высота для rowatindexpath:

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];
}

person prateek arora    schedule 07.09.2015    source источник


Ответы (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];
person prateek arora    schedule 15.09.2015