Как центрировать вид в сгруппированном UITableViewCell на iPad? - PullRequest
4 голосов
/ 10 августа 2011

Я конвертирую приложение для iPhone в iPad и застреваю в невинной и, казалось бы, тривиальной проблеме позиционирования.У меня есть UITableViewCell, который содержит только UISwitch, центрированный в ячейке.Ячейка находится в UITableView со сгруппированным стилем.

На iPhone я просто устанавливаю свойство center переключателя на центр ячейки в tableView:cellForRowAtIndexPath:. Этого достаточно для iPhone, потому что центр ячейки одинаков независимо от стиля таблицы. Это происходит и на iPhone, но смещение меньше, поэтому разница более тонкая.Вот код для iPhone:

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    UISwitch *view = [[UISwitch alloc] initWithFrame:CGRectZero];
    [view addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
    view.center = cell.center;        
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    [cell.contentView addSubview:view];
    [view release];

На iPad, без изменения какого-либо кода, положение переключателя по-прежнему находится в центре экрана iPhone.Это плохо, так как iPad намного больше, чем iPhone.Поэтому я переместил код позиционирования на tableView:willDisplayCell:forRowAtIndexPath:, и теперь он находится на другой стороне центра (ближе к правой стороне экрана).

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
UISwitch *s = (UISwitch *)[cell.contentView viewWithTag:SwitchTag];
s.center = CGPointMake(cell.contentView.center.x,s.center.y); //pushes the switch too far to the right

}

И все же, когда я регистрирую различные координаты и фреймы, которые меня интересуют, я получаю то, что ожидаю: координата x центра ячейки равнана 384,0, что составляет половину ширины экрана.Я также пытался пересчитать весь кадр UISwitch, но, поскольку я использую значения экрана, переключатель оказывается в том же месте, слишком далеко вправо.

Что я думаю, происходит из-за того, что после вызова tableView:willDisplayCell:forRowAtIndexPath: (или даже раньше) происходит какое-то преобразование, которое делает все эти числа бессмысленными.Это выглядит почти так, как будто вся ячейка смещена на x , где x - расстояние от края экрана до начала ячейки, даже если об этом не сообщается вframe свойство.

Я уверен, что есть кое-что тривиальное, что я пропускаю.Пожалуйста, просветите меня.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2012

Сгруппированные ячейки работают немного по-другому.У меня была похожая проблема, но вы предполагаете что-то о центре.Иногда временная установка цвета фона для всех видов различных представлений (cell.backgroundColor, cell.contentView.backgroundColor и т. Д.) Поможет вам немного лучше его визуализировать.

Возможно, вам придется сделать что-то вроде этого:

s.center = CGPointMake(s.superview.bounds.size.width / 2.0,s.center.y);

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

0 голосов
/ 15 февраля 2012

Вероятно, это не самое элегантное решение, и, конечно, оно не начинает понимать, почему вещи находятся не там, где вы ожидаете, что они портятся с представлениями tableCell, НО

view.center =CGPointMake(tableView.center.x-(view.frame.size.width/2), cell.center.y) ;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...