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