Вопрос: Рамка изображения UIView больше кадра


Я пытаюсь добавить subview в UIScrollView. Сначала я создаю экземпляр контроллера представлений из раскадровки, а затем устанавливаю рамку представления на границы приложений. Когда я добавляю представление в UIScrollView, он явно больше, чем предполагалось.

CGRect mainFrame = CGRectMake(0, topButtonHeight, screenWidth, screenHeight);

feelingVC = (FeelingViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"feelingVC"];
feelingVC.delegate = self;
feelingView = feelingVC.view;
[feelingView setFrame:mainFrame];
[self.scrollView addSubview:feelingView];

Я могу сказать, потому что его цвет фона проходит мимо того места, где он должен быть. Это также подтверждает режим «Инициализация режима отладки» в XCode. Но, если я проверю рамку представления, он распечатает то, что должно быть, а не то, что на самом деле.

Вид такого же размера, но сгенерированный полностью программно, работает так, как должен:

mainView = [[UIView alloc] initWithFrame:mainFrame];
mainView.backgroundColor = [UIColor blackColor];
[self.scrollView addSubview:mainView];

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

РЕДАКТИРОВАТЬ : Это вызвано из viewDidLoad контроллера представления, содержащего UIScrollView. screenWidth & screenHeight рассчитываются как таковые (они являются переменными экземпляра):

screenWidth = [UIScreen mainScreen].applicationFrame.size.width;
screenHeight = [UIScreen mainScreen].applicationFrame.size.height;

3


источник


Ответы:


Попробуйте установить рамку представления в viewWillAppear метод.

viewDidLoad не является хорошим местом для установки фреймов (потому что он вызывался только один раз при загрузке представления). Компоненты пользовательского интерфейса еще не настроены системой.

Кроме того, предпочитают использовать:

screenWidth = [UIScreen mainScreen].bounds.size.width;
screenHeight = [UIScreen mainScreen].bounds.size.height;

вместо

screenWidth = [UIScreen mainScreen].applicationFrame.size.width;
screenHeight = [UIScreen mainScreen].applicationFrame.size.height; 

поскольку границы имеют правильную позиционную информацию, принимая во внимание ориентацию устройства в этом случае.

Или вы можете просто сделать это после инициализации mainView внутри viewDidLoad: метод

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    mainView.frame = [UIScreen mainScreen].bounds;
}

вы также можете добавить это, чтобы перенастроить рамку просмотра всякий раз, когда обновляются подпункты:

- (void)viewWillLayoutSubviews { //or viewDidLayoutSubviews
    [super viewWillLayoutSubviews];
    mainView.frame = [UIScreen mainScreen].bounds;
}

6