2016-09-19 4 views
1

Под «странным», я замечаю следующее поведение:Добавление ChildViewController вызывает странное поведение ребенка ViewController

  • цвет фона устанавливается ChildViewController не появляется
  • несмотря на добавление основного крана жест распознаватель к ChildViewController, нет распознавания водопроводной
  • добавления UIButton к результатам ChildViewController в UIButton показанных, но нет ответа при касании со стороны UIButton

В моей ParentViewController, я представляю ChildViewController очень обобщенно, например:

UIViewController *viewController; 
viewController = (ChildViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"ChildViewController"]; 

[self addChildViewController:viewController]; 

viewController.view.frame = self.view.bounds; 
viewController.view.translatesAutoresizingMaskIntoConstraints = NO; 
viewController.view.center = self.view.center; 
[self.view addSubview:viewController.view]; 
[self.view bringSubviewToFront:viewController.view]; 

[viewController didMoveToParentViewController:self]; 

И здесь некоторые основные вещи, которые я делаю в ChildViewController «s viewDidLoad:

self.view.backgroundColor = [UIColor yellowColor]; 
UIButton *tapButton = [UIButton buttonWithType:UIButtonTypeSystem]; 
[tapButton addTarget:self action:@selector(tappedOnTap) forControlEvents:UIControlEventTouchUpInside]; 
//button view customization code omitted for brevity 
tapButton.userInteractionEnabled = YES; 
tapButton.enabled = YES; 
[self.view addSubview:tapButton]; 

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOnView)]; 
[self.view addGestureRecognizer:tapGesture]; 
[self.view setUserInteractionEnabled:YES]; 
[self.view addGestureRecognizer:tapGesture]; 

Я гарантировал, что все подключено правильно - однако, нет подтверждения в tappedOnView и tappedOnTap, когда я нажимаю на него, как на симуляторе, так и на устройстве.

Я пропустил что-то основное о представлении ChildViewController?

Редактировать

Для тех, кому интересно, это очень простого приложения на Github.

+0

может быть, попробуйте переместить его от 'viewDidLoad' до' viewDidAppear' и посмотреть, что происходит – random

+0

странно, переместив его в 'viewDidAppear', все исчезнет вместе. – daspianist

+0

попытайтесь удалить эту строку [viewController didMoveToParentViewController: self]; и сделайте это [self addChildViewController: viewController]; после [self.view addSubview: tapButton]; –

ответ

1

Зоны сдерживания прекрасны. Но если вы используете отладчик вида (view debugger), вы увидите, что frame не подходит. Это связано с тем, что вы отключили translatesAutoresizingMaskIntoConstraints, но у вас нет никаких ограничений. Вы можете превратить это обратно (и установить autoresizingMask соответственно):

viewController.view.translatesAutoresizingMaskIntoConstraints = true; 

Или вы можете определить ограничения вместо установки frame (и избыточно установки center):

//viewController.view.frame = self.view.bounds; 
viewController.view.translatesAutoresizingMaskIntoConstraints = false; 
//viewController.view.center = self.view.center; 

[self.view addSubview:viewController.view]; 

[NSLayoutConstraint activateConstraints:@[ 
    [viewController.view.topAnchor constraintEqualToAnchor:self.view.topAnchor], 
    [viewController.view.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor], 
    [viewController.view.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], 
    [viewController.view.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor] 
]]; 
+1

Ничего себе, эта простая вещь. Все предыдущие проблемы были решены в результате установки этого значения в true. Спасибо за ваше понимание этого и за предоставление кода при настройке ограничений. – daspianist

0

Попробуйте это:

ChildViewController *viewController; 
viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"ChildViewController"]; 

viewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleheight; 

[self addChildViewController:viewController]; 
[self.view addSubview:viewController.view]; 
[viewController didMoveToParentViewController:self]; 

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

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