Как исправить код корректировки маржи, прикрепленный для UITableView «Сгруппированный»? - PullRequest
0 голосов
/ 05 октября 2011

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

У меня это работает, ОДНАКО, когда пользователь меняет ориентацию, мне пришлось использовать метод didRotateFromInterfaceOrientation (так как willRotateToInterfaceOrientation не работал), НО эффект заключается в том, что вы видите быстрое изменение полей в этой частисекунда после отображения tableView.

ВОПРОС - Есть ли способ исправить ситуацию, чтобы этот переход не был виден?

- (void) removeMargins {
  CGFloat marginAdjustment = 7.0;
  CGRect f = CGRectMake(-marginAdjustment, 0, self.tableView.frame.size.width + (2 * marginAdjustment), self.tableView.frame.size.height);
  self.tableView.frame = f;
}

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  [self removeMargins];
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
  [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
  [self removeMargins];
}

Ответы [ 2 ]

1 голос
/ 11 октября 2011

Думаю, проблема в том, что в willRotateToInterfaceOrientation фрейм tableView еще не изменился, поэтому ваши вычисления фреймов неверны.на didRotateFromInterfaceOrientation кадр уже изменился.

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

Следующий код работал для меня без сбоев анимации:

@interface MyTableView : UITableView {
}

@end

@implementation MyTableView

-(void) layoutSubviews
{
    [super layoutSubviews];

    CGFloat marginAdjustment = 7.0;

    if (self.frame.origin.x != -marginAdjustment) // Setting the frame property without this check will call layoutSubviews again and cause a loop
    {
        CGRect f = CGRectMake(-marginAdjustment, 0, self.frame.size.width + (2 * marginAdjustment), self.frame.size.height);
        self.frame = f;
    }
}

@end
0 голосов
/ 11 октября 2011

Вы говорите, что willRotateToInterfaceOrientation не работает, но вы не сказали, почему.

Если причина в том, что willRotateToInterfaceOrientation не вызывается, тогда, пожалуйста, посмотрите на этот вопрос .

Если у вас все получится, то я верю, что ваш другой вопрос решится сам.

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