2015-09-08 6 views
0

Я использую пользовательскую кнопку (расширенный UIButton) в UITableViewCell. Эта кнопка имеет метод updateLayout, который добавляет некоторые графические настройки (границы, изображения, кросс-вставки, ...).Обновление макета iOS UITableViewCell

Я звоню этот метод UpdateLayout в

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ProfileSelect *cityButton = (ProfileSelect *)[cell viewWithTag:4]; 

    [cityButton updateLayout]; 
} 

Когда я динамически добавить новую ячейку таблицы, кнопка не отображается правильно (некоторые свойства ОК, некоторые нет).

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

Где я могу вызвать собственный метод updateLayout для правильного отображения кнопок?

+0

Пробовали ли вы поставить '[ cityButton updateLayout]; 'в' cellForRowAtIndexpath' после создания ячейки? – anhtu

+0

Да, я сделал, однако это не сработало, как ожидалось +, это вызывает проблемы с ограничениями. –

ответ

0

Мне удалось решить проблему, добавив категорию в UIButton + RuntimeAttribute.

Я использовал Xcode User Defined выполнения атрибутов определить необходимые параметры:

enter image description here

и переопределить методы сеттер в категории для обновления макета:

- (void)setBorderBottom:(BOOL)borderBottom 
{ 
    UIView *border = [UIView new]; 
    border.backgroundColor = [UIColor colorWithHexString:@"808080"]; 
    [border setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin]; 
    border.frame = CGRectMake(0, self.frame.size.height - borderWidth, self.frame.size.width, borderWidth); 
    [self addSubview:border]; 
} 

- (void)setBorderLeftFaded:(BOOL)borderLeftFaded 
{ 
    [self setImage:[UIImage imageNamed:@"text_field_left_border"] forState:UIControlStateNormal]; 
} 

- (void)setContentPadding:(float)contentPadding 
{ 
    [self setTitleEdgeInsets:UIEdgeInsetsMake(0.0, contentPadding, 0.0, contentPadding)]; 
} 
1

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

Предлагаю вам подкласс UITableViewCell и присвоить ему свойство cityButton. Тогда ваш код должен работать как эта одная

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    YourCustomCell *customCell = (YourCustomCell *)cell; 
    [cell.cityButton updateLayout]; 
} 
+0

Да, ты прав. Я переключу логику на подкласс UITableViewCell, однако поведение пользовательской кнопки остается неизменным. –

+0

ОК, я предлагаю вам переместить свой код на cellForRowAtIndexPath. – MarkHim

+0

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

1

Если границы вашей кнопки, вставки все же, это хорошая практика, чтобы установить их в пользовательской ячейке, переопределить -(void)awakeFromNib если Nib или - (void)layoutSubviews если программно.

Если они отличаются от ваших данных, вы можете установить их в - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath, так как ячейка используется повторно, поэтому не смешивайте их с источником данных.

+0

Они все одинаковые. Я подклассифицировал UITableViewCell и переместил updateLayout к методу - (void) layoutSubviews (в подклассе), но поведение остается прежним. –

+0

@ Fliper333 Может быть много причин, ваша кнопка равна нулю, когда вы их устанавливаете? Или вы добавили свою кнопку в контентный вид своей ячейки? Лучше разместить свой код. – John

+0

Кнопка находится в прототипе ячейки (добавлена ​​в представление содержимого ячейки с помощью конструктора интерфейса Xcode) и имеет тег. –

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