界面视图。如何快速找到根 SuperView?
Posted
技术标签:
【中文标题】界面视图。如何快速找到根 SuperView?【英文标题】:UIView. How Do I Find the Root SuperView Fast? 【发布时间】:2011-05-28 23:25:35 【问题描述】:我在视图层次结构中有一个随机子视图。到达根超级视图的最佳/最快/最聪明的方法是什么?
干杯, 道格
【问题讨论】:
【参考方案1】:如果您的应用只有一个UIWindow
(通常为 true),并且该窗口的唯一子视图是您的根控制器的视图(通常也为 true):
[randomChildView.window.subviews objectAtIndex:0]
或者您可以递归地爬出层次结构,通过检查 view.superview
直到找到其父视图为 nil
的视图。
【讨论】:
您可能需要仔细检查您是否会发现“superview is nil”我尝试过并陷入无限循环。 爬升的替代只需要几个微不足道的处理器周期,你不需要假设任何事情。我没有无限循环。【参考方案2】:直接进入超级视图层次结构所需的处理器时间是微不足道的。我的 UIView 类别中有这个。
- (UIView *)rootView
UIView *view = self;
while (view.superview != Nil)
view = view.superview;
return view;
swift3/4:
func rootSuperView() -> UIView
var view = self
while let s = view.superview
view = s
return view
【讨论】:
你的方法总是返回self.window
不,它会找到层次结构中最高的 UIView 元素。当然,如果你只在 self.window 下的视图上运行它,它只会返回 self.window。【参考方案3】:
我喜欢这个。
extension UIView
func rootView() -> UIView
return superview?.rootView() ?? superview ?? self
【讨论】:
【参考方案4】:快速解决方案(极简主义中的快速):
extension UIView
var rootView: UIView
superview?.rootView ?? self
【讨论】:
以上是关于界面视图。如何快速找到根 SuperView?的主要内容,如果未能解决你的问题,请参考以下文章
不能等于 Xcode 11 中的 Superview 的高度