Почему код в (isMovingToParentViewController) не запускается в viewDidLayoutSubviews () - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть viewController, я использую якоря и хочу получить кадр кнопки. Я хочу, чтобы кадр был только при включенном виде, поэтому я использую isMovingToParentViewController. Как это:

if isMovingToParentViewController {

    let myButtonFrame = myButton.convert(myButton.bounds, to: self.view)
}

Когда я добавляю его в viewWillAppear, код для получения рамки кнопки запускается, но когда я добавляю тот же код в viewDidLayoutSubviews, он не запускается.

Почему это так?

Просто чтобы быть ясным в viewDidLayoutSubviews, когда я добавляю точку останова, она достигает if isMovingToParentViewController, но код внутри этого никогда не срабатывает.

Когда представление выдвигается на isMovingToParentViewController получает удар, когда оно появляется isMovingToParentViewController не получает удар.

override func viewDidLoad() {
    super.viewDidLoad()

    // anchors are set here but the frames haven't been set yet
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if isMovingToParentViewController {

        // this code runs
        let myButtonFrame = myButton.convert(myButton.bounds, to: self.view)
    }
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if isMovingToParentViewController {

        // this code NEVER runs
        let myButtonFrame = myButton.convert(myButton.bounds, to: self.view)
    }
}

1 Ответ

0 голосов
/ 29 мая 2019

В документации заголовка указано, что isMovingToParentViewController и 3 других метода действительны только в обратных вызовах внешнего вида, таких как viewWillAppear, таким образом, не в обратных вызовах макета, таких как viewDidLayoutSubviews.

/*
  These four methods can be used in a view controller's appearance callbacks to determine if it is being
  presented, dismissed, or added or removed as a child view controller. For example, a view controller can
  check if it is disappearing because it was dismissed or popped by asking itself in its viewWillDisappear:
  method by checking the expression ([self isBeingDismissed] || [self isMovingFromParentViewController]).
*/

#if UIKIT_DEFINE_AS_PROPERTIES
@property(nonatomic, readonly, getter=isBeingPresented) BOOL beingPresented NS_AVAILABLE_IOS(5_0);
@property(nonatomic, readonly, getter=isBeingDismissed) BOOL beingDismissed NS_AVAILABLE_IOS(5_0);

@property(nonatomic, readonly, getter=isMovingToParentViewController) BOOL movingToParentViewController NS_AVAILABLE_IOS(5_0);
@property(nonatomic, readonly, getter=isMovingFromParentViewController) BOOL movingFromParentViewController NS_AVAILABLE_IOS(5_0);
#else
- (BOOL)isBeingPresented NS_AVAILABLE_IOS(5_0);
- (BOOL)isBeingDismissed NS_AVAILABLE_IOS(5_0);

- (BOOL)isMovingToParentViewController NS_AVAILABLE_IOS(5_0);
- (BOOL)isMovingFromParentViewController NS_AVAILABLE_IOS(5_0);
#endif
...