关于界面push时,控件下移的问题

704 阅读1分钟

原因1:transcent的问题。

先了解下viewcontroller的生命周期,

 -[ListViewController viewDidLoad]
 -[ListViewController viewWillAppear:]
 -[ListViewController viewWillLayoutSubviews]
 [ListViewController viewDidLayoutSubviews]
 在这个方法里可以拿到view的真实frame,一般可以在这里布局子类,如果时约束的话,在哪里应该都无所谓。同理我们知道view的layoutsubview方法,也是在父控件的frame确定后会调用,如果想获取父类的frame,这里也是准确的。
 [ListViewController viewDidAppear:]

self.navigationController.navigationBar.translucent = NO translucent:是半透明的意思,它是导航条的一个属性。我们知道push依赖的是同一个导航栏,默认Yes。

@property(nonatomic,assign) BOOL extendedLayoutIncludesOpaqueBars API_AVAILABLE(ios(7.0)); //Defaults to NO, but bars are translucent by default on 7_0.

self.extendedLayoutIncludesOpaqueBars = NO; Yes代表当导航栏不透明时,当前页面view的布局从导航栏顶部开始计算。 需要注意 导航栏半透明时,view是包含导航栏的。

问题:一个界面是从导航栏底部开始,一个界面是从导航栏是从顶部开始,切换会有闪动。 一个导航栏透明,一个不透明,切换。 一个导航栏不透明,一个导航栏透明,切换会出问题。

self.edgesForExtendedLayout option看官方解释 iOS 10之前用的,移除某一个方向的layout,控件会避开导航栏等bar。可以不用考虑。 www.jianshu.com/p/a1987a7c1…

原因2

@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets API_DEPRECATED("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0));

// Defaults to YES scrollview 有一个自动移动的属性,在界面被挡住时,他会自动下移,把这个属性关掉就可以了。