1

У меня есть 3 элемента пользовательского интерфейса в contentViewUITableViewCell, которые необходимо правильно выровнять, когда устройство вращается. В настоящее время я в жизнь рамки этих элементов пользовательского интерфейса, как это:UITableViewCell autoresizingmask issue

segmentedControl1.frame = CGRectMake(165, 15, 130, 40); 
segmentedControl2.frame = CGRectMake(435, 15, 130, 40); 
segmentedControl3.frame = CGRectMake(710, 15, 130, 40); 

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

Я пытался что-то вроде этого:

segmentedControl1.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin; 
segmentedControl2.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; 
segmentedControl3.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin; 

Но это не похоже на работу. Элементы все перекрываются и несчастливо выкладываются.

Любые предложения?

UPDATE 1

Вот что в настоящее время выглядит вид ячейки таблицы, как в ландшафтном режиме:

-------------------------------------------------------------------------- 
| ============    ============    ============  | 
| | A | B |   | A | B |   | A | B | | 
| ============    ============    ============  | 
-------------------------------------------------------------------------- 

И вот что я хочу, когда устройство поворачивается в портретный режим:

------------------------------------------------------- 
| ============ ============ ============  | 
| | A | B | | A | B | | A | B | | 
| ============ ============ ============  | 
------------------------------------------------------- 

ОБНОВЛЕНИЕ 2 Вот моя компания де в cellForRowAtIndexPath включения предложений от @Wolfert

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 

    // Configure the cell... 
    segmentedControl1.frame = CGRectMake(165, 15, 180, 40); 
    segmentedControl1.tag = indexPath.row; 
    segmentedControl1.autoresizingMask = UIViewAutoresizingFlexibleRightMargin; 
    [cell.contentView addSubview:segmentedControl1]; 

    segmentedControl2.frame = CGRectMake(435, 15, 180, 40); 
    segmentedControl2.tag = indexPath.row; 
    segmentedControl2.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; 
    [cell.contentView addSubview:segmentedControl2]; 

    segmentedControl3.frame = CGRectMake(710, 15, 180, 40); 
    segmentedControl3.tag = indexPath.row; 
    segmentedControl3.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; 
    [cell.contentView addSubview:segmentedControl3]; 

    return cell; 
} 

ответ

3

Это должно сделать трюк:

segmentedControl1.autoresizingMask = UIViewAutoresizingFlexibleRightMargin; 
segmentedControl2.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; 
segmentedControl3.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; 

Обратите внимание, что их супер вид должен иметь это свойство:

view.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
+1

Это не работает ... извините! Любые дополнительные предложения? Я обновил вопрос с некоторыми графиками, чтобы показать, о чем я говорю ... – Ravi

+0

Извините, моя вина. Я повторил взгляды, чтобы проверить мое решение, и оно действительно потерпело неудачу. - Я обновил свой ответ с рабочей и проверенной версией: – Wolfert

+0

Эй, @Wolfert, я включил ваши предложения, но он все еще не работает. Фактически, с вышеуказанными значениями autoresizingMask, segmentedControl2 и segmentedControl3 исчезают ... Я обновил свой вопрос с использованием фактического кода, который я использую. – Ravi

1

Я немного запутался что вы говорите, что у вас есть рабочая конфигурация ландшафта. Я бы сказал, что объединяя ваши жестко закодированные номера CGRectMake с приведенными вами значениями autoresizingMask, вы должны привести к перекосу.

Как бы то ни было, вот мой совет: вы не должны использовать жестко заданные цифры для ширины ваших исходных кадров. Вместо этого вы должны основывать свои вычисления на cell.contentView.bounds.size.width. В вашем случае что-то вроде этого:

- (UITableViewCell*) tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
    static NSString* cellIdentifier = @"Cell"; 
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease]; 

    NSArray* items = [NSArray arrayWithObjects:@"A", @"B", nil]; 
    UISegmentedControl* segmentedControl1 = [[[UISegmentedControl alloc] initWithItems:items] autorelease]; 
    UISegmentedControl* segmentedControl2 = [[[UISegmentedControl alloc] initWithItems:items] autorelease]; 
    UISegmentedControl* segmentedControl3 = [[[UISegmentedControl alloc] initWithItems:items] autorelease]; 
    [cell.contentView addSubview:segmentedControl1]; 
    [cell.contentView addSubview:segmentedControl2]; 
    [cell.contentView addSubview:segmentedControl3]; 

    // Some values I like 
    CGFloat marginHorizontal = 10; 
    CGFloat spacingHorizontal = 8; 
    // This is the crucial line! 
    CGFloat totalWidth = cell.contentView.bounds.size.width; 
    // That's how much is available to the three controls 
    CGFloat availableWidth = totalWidth - 2 * marginHorizontal - 2 * spacingHorizontal; 
    // That's how much each control gets - initially! 
    CGFloat segmentedControlWidth = availableWidth/3.0; 

    // These are the numbers from your example. With these numbers your table view 
    // delegate probably implements tableView:heightForRowAtIndexPath:() 
    CGFloat marginVertical = 15; 
    CGFloat segmentedControlHeight = 40; 

    CGRect segmentedControlFrame = CGRectMake(marginHorizontal, 
              marginVertical, 
              segmentedControlWidth, 
              segmentedControlHeight); 
    segmentedControl1.frame = segmentedControlFrame; 
    segmentedControlFrame.origin.x += spacingHorizontal + segmentedControlWidth; 
    segmentedControl2.frame = segmentedControlFrame; 
    segmentedControlFrame.origin.x += spacingHorizontal + segmentedControlWidth; 
    segmentedControl3.frame = segmentedControlFrame; 

    // These are the values you cited initially, they are fine 
    segmentedControl1.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin; 
    segmentedControl2.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; 
    segmentedControl3.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin; 

    return cell; 
} 

Я пробовал это на симуляторе iPad, и он работал отлично. Обратите внимание, что вам не нужно изменять autoresizingMask как сотовой, так и контентной. Я знаю, что это отличается от того, как нормально работает UIView, но у меня нет объяснений, за исключением того, что ящики таблицы выглядят странными животными :-)

Назад к исходному коду: Коренная проблема заключается в том, что жестко закодированные номера предположим, что представление содержимого имеет полную ширину экрана, когда на самом деле его начальная ширина намного меньше (в моей среде cell.contentView.bounds.size.width изначально 320).Таким образом, начальная схема выглядит примерно так:

+-content view------------+ 
| ============   | ============    ============ 
| | A | B |  | | A | B |   | A | B | 
| ============   | ============    ============ 
+-------------------------+ 

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

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