Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 尝试在框架内以编程方式实现MKMapView_Swift_Mkmapview_Frame - Fatal编程技术网

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

Swift 尝试在框架内以编程方式实现MKMapView,swift,mkmapview,frame,Swift,Mkmapview,Frame,我正在使用Swift 5,Xcode 11.3.1创建一个应用程序。最初,我使用Swift中的storyboard创建了该应用程序,但现在我正在通过该应用程序以编程方式实现标签、文本字段、选择器、开关、按钮等。然而,当我尝试以编程方式编写一个场景时遇到了一个障碍,该场景使用的是我最初使用storyboard创建的MKMapView 当我使用故事板创建时,我的屏幕/场景分为3个部分/区域,前100个点(CGFloat-pts)用于显示一些文本。然后我有一个高度为413pts的MKMapView,来

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

当我使用故事板创建时,我的屏幕/场景分为3个部分/区域,前100个点(CGFloat-pts)用于显示一些文本。然后我有一个高度为413pts的MKMapView,来自pt 106。MKMapView延伸到边缘,因此几乎是一个正方形(ish)。。。屏幕/场景的下部用于显示一些文本、两个UI开关和一个自定义按钮。在MKMVIEWVIEW中,我还有一个标记,显示中心点和用户位置,这样用户就可以滚动地图到地图上的另一个点,地图上的标记表示。 所以,这里是出问题的地方。。。我试图以编程方式为MKMapView定义相同类型的外观,但是它会一直全屏显示地图,因此会覆盖我用于显示文本和按钮的上部和下部区域。我无法理解为什么MKMapView没有坚持我设置的框架或约束。我的第一次尝试是定义框架,但是后来我读了一些书,我想我也需要编写约束代码。然而,现在当应用程序运行约束(第一个约束)时,会导致应用程序出现错误

2020-03-14 21:43:57.509878+1100 MyGarageApp[17060:95627]*由于未捕获的异常“NSGenericeException”而终止应用程序,原因是:“无法使用锚激活约束,因为它们没有共同的祖先。”。约束或其锚定是否引用不同视图层次中的项?这是违法的。” *第一次抛出调用堆栈:

以下是我显示地图的代码:

[这段代码在我的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部分之后的一个方法(即在我的body方法中)

任何人都可以通过编程的方式给出解决这个问题的任何指导,我将不胜感激,因为我渴望摆脱故事板的限制,并且能够控制我的代码以恰当地满足设备的需要


提前感谢大家。

首先,使用约束要求将
translatesAutoResizezingMackintoConstraints
设置为
false
。其次,将贴图的帧设置为从x=0开始,然后将前导约束设置为x=10,这意味着这两个约束将相互冲突

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

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


我的最后一点意见是,您在这里定义的约束可以更好地用相对术语来定义,因为现在移动到一个更大的屏幕将完全扰乱您的布局

Thijs van der Heijden你是个传奇!!非常感谢你,你对前三颗子弹的反馈非常有效。重新。第四点你也完全正确,但是我故意去掉了我的变量,让代码更容易阅读,但是我完全同意你的观点,我只是把它们加进去。再次感谢:)没问题!谢谢你的客气话:D
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)
}