2015-09-05 2 views
2

Идея состоит в том, чтобы сделать что-то вроде WhatsApp, который выравнивает сообщения слева и справа для каждого пользователя.Динамически выравнивать UITextView внутри таблицы TableView.

Я пытаюсь этот код:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    var cell = messageTableView.dequeueReusableCellWithIdentifier("messageCell") as! MessageCell 

    // get the items in this section 
    let sectionItems = self.getSectionItems(indexPath.section) 

    // get the item for the row in this section 
    let currentMessage = sectionItems[indexPath.row] 

    var messageTextViewAlignment: NSLayoutFormatOptions 

    if (currentMessage.from == self.currentUserId) 
    { 
     messageTextViewAlignment = NSLayoutFormatOptions.AlignAllRight 
    } 
    else 
    { 
     messageTextViewAlignment = NSLayoutFormatOptions.AlignAllLeft 
    } 

    var newConstraint = NSLayoutConstraint.constraintsWithVisualFormat("H:[messageTextView]", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["messageTextView": cell.messageTextView]) 

    cell.messageTextView.addConstraints(newConstraint) 

    return cell 
} 
+0

им это перестарались, но техника его подводит работы: cell.messageTextView.autoresizingMask = UIViewAutoresizing.FlexibleLeftMargin cell.messageTextView.autoresizingMask = UIViewAutoresizing.FlexibleRightMargin –

+0

Я не вижу, где вы назначаете 'messageTextViewAlignment' ячейке? – anhtu

+0

в настройках поля, я попробовал, но не работал тоже ... –

ответ

0

Я не уверен, что вы хотите достичь. Совместите UILabel на правильной стороне экрана или выровнять текст в UILabel

воображая вы хотите выровнять UIlabel, чтобы это круто пустое пространство слева или справа от пузыря, как в Что App. здесь некоторые вещи вы могли бы попробовать:

Использование IB

Поскольку вы используете IB для пользовательского UITableViewCell, который кажется только содержать сообщение, не может просто IBOutlets для вас ведущий ВЕННЫХ хвостовых ограничений от UILabel к ячейка contentView поля.

Это будет выглядеть так:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *labelLeadingConstrain; 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *labelTrailingConstrain; 

И в вашем коде

if (currentMessage.from == self.currentUserId) 
{ 
    labelLeadingConstrain = X1; 
    labelTrailingConstrain = X2; 
} 
else 
{ 
    labelLeadingConstrain = X2; 
    labelTrailingConstrain = X1; 
} 

[...] 

return cell 

}

Программным

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

if (currentMessage.from == self.currentUserId) 
{ 
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-X1-[constraintUILabel]-X2-|" options:0 metrics:nil views:@{@"constraintUILabel" :cell.messageTextView}]]; 
} 
else 
{ 
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-X2-[constraintUILabel]-X1-|" options:0 metrics:nil views:@{@"constraintUILabel" :cell.messageTextView}]]; 
} 

[...] 

return cell 

}

Использование AlignAllRight

Это ограничение относится к 2 видом, по крайней мере. Таким образом, есть ваша messageTextView и предположим, у вас есть messageView, который содержит его (может быть сам по себе в tableViewCell»contentView)

[NSLayoutConstraint constraintsWithVisualFormat:@"H:[messageTextView][messageView]" options:NSLayoutFormatAlignAllRight metrics:nil views:@{@"messageTextView" :cell.messageTextView},@"messageView" :cell.messageView}] 

В вашем фрагменте переменная messageTextViewAlignment никогда не используется, так что я считаю, вы должны использовать отрезала выше (Swift стиле) замена NSLayoutFormatAlignAllRight с messageTextViewAlignment вар

+0

, прежде чем я спрошу здесь, я сделал с ограничениями, он работает, но я думаю, что это не решение для goo –

+0

ОК, в этом случае я не понимаю, почему вы применяете свое ограничение onlt-y к 'messageTextViewAlignment'. «AlignAllRight» выравнивает правые края нескольких видов, поэтому я считаю, что вам нужно как минимум 2 вида на вашем входе. Я отредактирую свой ответ, чтобы предложить вариант –

0

@ «Николас Браун» Прежде чем спросить здесь, я закодировать это решение, то, как вы предлагаете в «Использование IB», она работает, но я думаю, что это не является хорошим решением:

func alignTextView(textViewAlignment: NSLayoutFormatOptions) 
{ 
    horizontalSpaceFromContentViewToTextView.constant = 0 

    let spaceX = initialTextViewWidth - finalTextViewWidth 

    if(spaceX > 0) 
    { 
     if (textViewAlignment == NSLayoutFormatOptions.AlignAllRight) 
     { 
      horizontalSpaceFromContentViewToTextView.constant = spaceX 
     } 
    } 
    //println("spcaceX: \(spaceX) --- \(messageTextView.text)") 
} 

Я хочу, чтобы сделать работу с NSLayoutFormatOptions.AlignAllRight и NSLayoutFormatOptions.AlignAllLeft

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