gpt4 book ai didi

ios - 将自定义 View 锚定到 Swift 中 Mapbox NavigationViewController 中的现有 View

转载 作者:行者123 更新时间:2023-11-28 13:23:27 25 4
gpt4 key购买 nike

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

我添加了一个额外的按钮(见屏幕截图的左上角),我想将它锚定到右侧的 FloatingStackView,以便它随着顶部横幅的变化而上下移动(类似于 FloatingStackView 行为) .问题是我似乎无法访问 FloatingStackView。从我在 Mapbox 源代码中看到的,FloatingStackViewNavigationView 的 subview ,它是 RouteMapViewController 的 View ,它是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 的引用,我想我可以处理布局。

如何解决 is inaccessible due to 'internal' protection level 错误或找到另一种方法来访问 float 堆栈 View ?

screenshot

来自 NavigationView 类源码

NavigationViewClass

最佳答案

如果标记为内部,您将无法直接引用它。然而,有一种 hacky 方法可以获取任何 View 并将其用于 AutoLayout(假设该 View 使用 autoLayout 并且具有您可以使用的 anchor )。

由于每个 View 都有一个 subViews 数组,您可以遍历 subview 以找到您想要的那个。所有 subview 都是可见的,即使是来自私有(private)实例的 subview 也是如此。诀窍在于确定您需要的那个。

如果类型定义是可访问的,你可以这样做

let navView = viewController.subViews.first{$0 is NavigationView}!
let stackView = navView.subViews.first{$0 is UIStackView}!
floatingButton.topAnchor.constraint(equalTo: stackView.topAnchor).isActive true

如果您没有可以匹配的类型,您将不得不做一些更 hacky 的事情,例如匹配描述:.first{$0.description conatins "stack"}。或者甚至通过索引 subView 数组来反复试验,直到获得所需的结果,然后希望 View 的顺序始终相同!

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

请注意,为了简洁起见,我已经强制展开了上面的 View - 您也希望在生产代码中更加谨慎 :-)

关于ios - 将自定义 View 锚定到 Swift 中 Mapbox NavigationViewController 中的现有 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58750379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com