UITableViewCell проблема с авторезизацией маски - PullRequest
1 голос
/ 19 декабря 2011

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

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;

Но, похоже, это не работает. Все элементы наложены друг на друга и расположены несчастным образом.

Есть предложения?

ОБНОВЛЕНИЕ 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;
}

Ответы [ 2 ]

3 голосов
/ 19 декабря 2011

Это должно сработать:

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

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

view.autoresizingMask = UIViewAutoresizingFlexibleWidth;
1 голос
/ 25 января 2012

Я немного озадачен тем, что вы говорите, что у вас рабочая конфигурация ландшафта. Я бы сказал, что объединение ваших жестко закодированных чисел 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   |
|    ============         |    ============             ============ 
+-------------------------+

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

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