Я конвертирую приложение для 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
свойство.
Я уверен, что есть кое-что тривиальное, что я пропускаю.Пожалуйста, просветите меня.