我有一个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)
}
}
答案 0 :(得分:0)
标题文档指出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