Ios 将自定义视图锚定到Swift中Mapbox NavigationViewController中的现有视图

Ios 将自定义视图锚定到Swift中Mapbox NavigationViewController中的现有视图,ios,swift,autolayout,mapbox,mapbox-ios,Ios,Swift,Autolayout,Mapbox,Mapbox Ios,我在Swift中使用iOS上的Mapbox框架创建自定义NavigationViewController。我需要帮助获取NavigationView上的FloatingStackView的引用 我添加了一个额外的按钮(请参见屏幕截图的左上角),我希望将其定位到右侧的FloatingStackView,以便它随着顶部横幅的变化而上下移动(类似于FloatingStackView行为)。问题是我似乎无法访问FloatingStackView。从我在Mapbox源代码中看到的FloatingStack

我在Swift中使用iOS上的Mapbox框架创建自定义NavigationViewController。我需要帮助获取
NavigationView
上的
FloatingStackView
的引用

我添加了一个额外的按钮(请参见屏幕截图的左上角),我希望将其定位到右侧的FloatingStackView,以便它随着顶部横幅的变化而上下移动(类似于FloatingStackView行为)。问题是我似乎无法访问FloatingStackView。从我在Mapbox源代码中看到的
FloatingStackView
NavigationView
的子视图,它是一个
RouteMapViewController
的视图,它是一个NavigationViewController的
mapViewController
。问题是我无法访问mapViewController,因为它由于内部保护级别而无法访问

下面是我想做的一个例子:

import UIKit
import MapboxNavigation

class DemoNavigationViewController: NavigationViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let mapVC = mapViewController
        // Do any additional setup after loading the view.
    }

}
以下是let mapVC行上的错误:

'mapViewController' is inaccessible due to 'internal' protection level
我的最终目标是能够通过如下方式访问FloatingStackView:

let navigationView = mapViewController.view as? NavigationView
let floatingStackView = navigationView.floatingStackView
如果我能得到那个floatingStackView的引用,我想我能处理这个布局

如何绕过由于“内部”保护级别而无法访问的
错误,或找到其他方法访问浮动堆栈视图

来自NavigationView类源代码


如果标记为“内部”,则无法直接引用它。但是,有一种黑客方法可以访问任何视图并将其用于AutoLayout(假设该视图使用AutoLayout并具有您可以使用的锚定)

由于每个视图都有一个
子视图
数组,因此您可以迭代子视图以找到所需的子视图。所有子视图都可见,即使是来自私有实例的子视图。诀窍是确定你需要的

如果类型定义是可访问的,则可以执行以下操作

let navView = viewController.subViews.first{$0 is NavigationView}!
let stackView = navView.subViews.first{$0 is UIStackView}!
floatingButton.topAnchor.constraint(equalTo: stackView.topAnchor).isActive  true
如果您没有可以匹配的类型,那么您将不得不做一些更粗糙的事情,例如匹配描述:
。首先{$0.description conatins“stack”}
。或者甚至通过反复试验,对子视图数组进行索引,直到得到所需的结果,然后希望视图的顺序始终相同

您是否想在生产代码中冒险只是您可以做出的一个决定,因为如果库更改了它的UI设计,它可能会被破坏。根据应用程序的用户群,我可能会冒与类型匹配的风险,但其他方式可能不会


请注意,为了简洁起见,我已经强制展开了上面的视图-您可能希望在生产代码中使用它时更加谨慎:-)

这太棒了!多好的解决方案啊。你说得对,这可能有风险。我将在中添加一些保护语句,并提供一个后备方案,以防它找不到stackview,但这是完美的。