尝试在框架内以编程方式实现 MKMapView

Trying to implement MKMapView Programmatically within a frame

我正在创建一个应用程序,使用 Swift 5,Xcode 11.3.1。最初我在 Swift 中使用情节提要创建了该应用程序,但我现在正在通过该应用程序以编程方式实现标签、文本字段、选择器、开关、按钮等。但是,当我尝试以编程方式编写我的场景之一时,我遇到了一个障碍,该场景使用的是我最初使用故事板创建的 MKMapView。

当我使用 Storyboard 创建时,我的 screen/scene 被分成 3 sections/areas,前 100pts (CGFloat pts) 用于显示一些文本。然后我有来自 pt 106 的 MKMapView,高度为 413pts。 MKMapView 延伸到边缘,因此几乎是一个正方形(ish)...屏幕/场景的下部用于显示一些文本、几个 UISwitch 和一个自定义按钮。在 MKMapView 中,我还有一个显示中心点和用户位置的标记,以便用户可以将地图滚动到地图上的另一个点,该点由地图中间的标记表示。

所以,这就是它出错的地方......我试图以编程方式为 MKMapView 定义相同类型的外观,但是它一直在全屏显示地图,因此覆盖了我所在的上部和下部区域用于显示文本和按钮。我无法弄清楚为什么 MKMapView 没有遵守我设置的框架或约束。我的第一次尝试是定义框架,但是后来我做了一些阅读,我认为我也需要对约束进行编码。但是,现在当应用程序运行时,约束(第一个)导致应用程序因错误而崩溃....

2020-03-14 21:43:57.509878+1100 MyGarageApp[17060:95627] * 由于未捕获的异常而终止应用程序 'NSGenericException',原因:'无法激活约束有锚,因为它们没有共同的祖先。约束或其锚点是否引用不同视图层次结构中的项目?那是非法的。 * 首先抛出调用堆栈:

这是我显示地图的代码:

[这段代码在我的viewDidLoad之前]

 // Early IBOutlets required to define the scene
var theMapView: MKMapView!

@IBOutlet weak var addressLabelOutlet: UILabel!


let centerMapButton: UIButton = {
    let button = UIButton(type: .system)
    button.setImage(UIImage(named: "MapPointer.png"), for: .normal)
    button.addTarget(self, action: #selector(handleCenterOnUserLocation), for: .touchUpInside)
    button.translatesAutoresizingMaskIntoConstraints = false
    return button
}()

下一段代码是我的 viewDidLoad 部分之后的一个方法(即在我的主体方法中)...

func configureMapView() {

    theMapView = MKMapView(frame: CGRect(x: 0, y: 106, width: self.view.frame.width, height:413))

    theMapView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10).isActive = true
    theMapView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 106).isActive = true
    theMapView.heightAnchor.constraint(equalToConstant: 413).isActive = true
    theMapView.widthAnchor.constraint(equalToConstant: 355).isActive = true

    theMapView.showsUserLocation = true
    theMapView.userTrackingMode = .follow

    theMapView.frame = view.frame
    view.addSubview(theMapView)
}

任何人都可以提供以编程方式解决此问题的任何指导,我将不胜感激,因为我渴望摆脱情节提要的限制并控制我的代码以正确满足设备需求。

提前谢谢大家。

首先,使用约束需要将translatesAutoresizingMaskIntoConstraints设置为false。其次,您将地图的框架设置为从 x = 0 开始,然后将前导约束设置为 x = 10,这意味着这两者将相互冲突。

此外,只有在将视图添加到视图层次结构后才能添加约束,因此请将约束移至 view.addSubview() 行下方。

添加约束后,尝试调用 theMapView.layoutIfNeeded() 以实际触发地图视图的重新布局。

我的最后一条评论是,您在这里定义的约束可以用相对术语更好地定义,因为现在移动到例如更大的屏幕会完全弄乱您的布局。