Программное создание представления с фреймом на основе другого представления, созданного в раскадровке с автоматическим макетом

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

Моя проблема в том, что, поскольку я создаю эти два представления в программе, я не уверен, где я должен устанавливать кадры подвидов. Это то, что я делаю сейчас, в viewDidLayoutSubviews, но в идеале я хотел бы сделать это в viewDidload, но в viewDidLoad рамка еще не установлена:

@interface ViewController () 
   @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
   @property (nonatomic, strong) UIView *pageOne;
   @property (nonatomic, strong) UIView *pageTwo;
@end

- (void) viewDidLayoutSubviews

{
    self.scrollView.pagingEnabled = YES;
    self.pageOne = [[UIView alloc] initWithFrame: CGRectMake(0, 0, self.scrollView.bounds.size.width, self.scrollView.bounds.size.height)];
self.pageOne.backgroundColor = [UIColor redColor];
    [self.scrollView addSubview:self.pageOne];

    self.pageTwo = [[UIView alloc] initWithFrame: CGRectMake(self.scrollView.bounds.size.width, 0, self.scrollView.bounds.size.width, self.scrollView.bounds.size.height)];
    self.pageTwo.backgroundColor = [UIColor blueColor];
    [self.scrollView addSubview:self.pageTwo];


    self.statsScrollView.contentSize = CGSizeMake(self.scrollView.bounds.size.width * 2, self.scrollView.bounds.size.height);
}

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


person Dogahe    schedule 24.10.2015    source источник


Ответы (1)


Вам нужно дождаться завершения фактического макета, прежде чем вы сможете захватить кадр, поэтому viewDidLayoutSubviews — хороший выбор. Если вы хотите убедиться, что страницы добавляются только один раз, вы можете просто включить проверку, если они уже были инициализированы ранее, например:

if (!self.pageOne) {
    self.pageOne = [[UIView alloc] initWithFrame: CGRectMake(0, 0, self.scrollView.bounds.size.width, self.scrollView.bounds.size.height)];
    self.pageOne.backgroundColor = [UIColor redColor];
    [self.scrollView addSubview:self.pageOne];
}

Конечно, вы также можете инициализировать страницы в своем viewDidLoad-методе с помощью фрейма CGRectZero и добавить их в качестве подпредставлений, а затем установить соответствующие фреймы позже, то есть:

В viewDidLoad:

self.pageOne = [[UIView alloc] initWithFrame: CGRectZero];
self.pageOne.backgroundColor = [UIColor redColor];
[self.scrollView addSubview:self.pageOne];

В viewDidLayoutSubviews:

self.pageOne.frame = CGRectMake(0, 0, self.scrollView.bounds.size.width, self.scrollView.bounds.size.height);
person Gamma    schedule 24.10.2015
comment
Первое решение не работает, потому что viewDidLayoutSubviews вызывается несколько раз, и при первом вызове нет гарантии, что self.scrollView.bounds имеет окончательное значение, и на самом деле для моего случая это не так, поэтому первое решение исправило бы self.pageOne кадра на неверное значение. Но второе решение сработало. Спасибо. - person Dogahe; 27.10.2015