2013-10-16 5 views
5

У меня есть приложение для iPhone, в котором я использую UITableView для форматирования набора текстовых ответов, по одному в строке. Я установил ячейку в раскадровке, чтобы в ней был ярлык, и установил ограничение, говорящее, что метка должна быть на 10 точек от края ячейки. Затем я настроил собственный подкласс UITableViewCell, установил ячейку в раскадровке этого класса и подключил выход.Содержимое UITableViewCell перемещается

Однако, когда я загружаю таблицу, я вижу, что текст в ячейке слегка перемещается вправо при некоторых обстоятельствах: когда я выбираю ячейку или когда я загружаю дополнительные ячейки в таблицу. Фактически, в последнем случае иногда все смещается вправо, даже клетки, которые уже были там!

Что, черт возьми, происходит здесь? Единственные изменения, которые я делаю в tableView:cellForRowAtIndexPath:, - это текст в ярлыке, и я всегда его настраиваю. И я отключил «Отступ во время редактирования» в ячейке в раскадровке.

Ответ на некоторые из вопросов: Я настраиваю просмотр с помощью раскадровки. Xcode не сообщает о какой-либо двусмысленности в отношении ограничений. Кроме того, здесь есть скриншоты, до и после:

enter image description here enter image description here

+2

Не могли бы вы показать нам какой-то код .. esp часть, в которой вы устанавливаете свой nsconstraint (вы устанавливаете его программно или через раскадровку?) – abbood

+0

можете ли вы также поместить некоторые скриншоты того, что выглядит в ячейке, прежде чем двигаться и после перемещения ? – abbood

+0

Удастся ли вам отделить проблематичный контроллер зрения и просмотра, поместить его в новый проект и поделиться своим источником? –

ответ

1

Мое предположение о том, что ограничения на этикетке неоднозначны. Неоднозначность может привести к тому, что компоненты пользовательского интерфейса скачутся по необъяснимым причинам. Вероятно, вам нужно установить больше ограничений для метки, чтобы определить ее положение на обеих осях.

Или, возможно, все, что вам нужно сделать, это установить метку «размер, который соответствует содержимому» (внутренний размер содержимого) в меню «Редактор» в IB.

+0

Xcode не сообщает о каких-либо двусмысленных ограничениях, и я не получаю никаких сообщений журнала, связанных с ограничениями, так что может и не быть. Установка ярлыка на собственный размер содержимого не выглядит так, как это имеет смысл, поскольку каждая строка в таблице будет иметь другой текст в ярлыке. – dpassage

+0

Xcode не сообщает о двусмысленных ограничениях автоматически. Вы должны вызвать hasAmbiguousLayout на свой взгляд. – bilobatum

+0

Когда метка установлена ​​на ее собственный размер содержимого, она автоматически корректирует свой размер в соответствии с размером его содержимого, то есть его текстом. – bilobatum

-1

Если у вас есть собственный подкласс UITableViewCell, попробуйте ввести layoutSubviews. Позвольте мне от верхней части моей головы:

static CGFloat const kLeftMargin = 10.0f; 

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 

    /* Prepare for processing */ 
    CGSize cellSize = self.bounds.size; 

    /* Change the textLabel frame */ 
    { 
    /* Compute the new label frame */ 
    CGSize labelSize = self.textLabel.bounds.size; 
    CGFloat xCoor = kLeftMargin; 
    CGFloat yCoor = roundf((cellSize.height - labelSize.height)/2.0f); 
    CGRect labelFrame = CGRectMake(xCoor, yCoor, 
            labelSize.width, labelSize.height); 

    /* Set the new label frame */ 
    self.textLabel.frame = labelFrame; 
    } 
} 

Теперь, это не то, что обычно рекомендуются (так как много людей используют раскадровку и NIBS), но из опыта, если вы хотите, чтобы некоторые правильно сделало Оформление печатных изданий , осуществить layoutSubviews.

+0

Кто-нибудь даже пробовал это перед тем, как спуститься? –

1

Вы добавили новый ярлык в UITableViewCell или работаете с textLabel, который уже существует в нем? Если вы добавили новый, подумайте об удалении его и использовании существующего свойства textLabel. Если по какой-то причине это не вариант, дважды проверьте, что ярлык, который вы добавили, находится в contentView ячейки, и что все ограничения относятся к родительскому виду, а не к самой ячейке.

Кроме того, для отладки вы можете установить цвет фона контента contentView на красный (cell.contentView.backgroundColor = [UIColor redColor];) - это может дать вам лучшее представление о том, что движется, ярлык или весь вид ,

1

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

UIView *oldLabel = [cell viewWithTag:3]; 
if (oldLabel != nil) 
{ 
    [oldLabel removeFromSuperview]; 
} 

Затем я добавил новый лейбл, как это:

[cell.contentView addSubview:newLabelOrWhatever]; 
1

Это может быть стоит проверить, чтобы увидеть, что содержимое строки не имеет пространства приставкой на Это.Кроме того, вы можете проверить фактическое положение метки, установив цвет фона.

0

У меня была аналогичная проблема, когда метка перемещалась при выборе ячейки. Это была обычная ячейка, которую я загружал из пользовательского Nib.

В Nib я не установил backgroundView UITableViewCell (суперкласс) на любой вид. Как только я установил его (я установил его в ContentView), проблема остановилась.

Мои ограничения автоматической компоновки кажутся прекрасными и не имеют проблем, поэтому я предполагаю, что это было исправлено выше.

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