我正在使用Swift 5,Xcode 11.3.1创建一个应用程序。最初,我是使用Swift中的情节提要创建应用的,但现在我正在通过应用以编程方式实现标签,文本字段,选择器,开关,按钮等。但是,当我尝试使用我最初使用情节提要创建的MKMapView进行编程编码时,遇到了一个障碍。
当我使用情节提要创建时,我的屏幕/场景分为3个部分/区域,其中前100个点(CGFloat pt)用于显示一些文本。然后我有高度为ptpts的pt 106的MKMapView。 MKMapView延伸到边缘,因此几乎是一个正方形(ish)...屏幕/场景的下部用于显示一些文本,几个UISwitches和一个自定义按钮。在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)
}
任何人都可以通过编程方式解决此问题的指南将不胜感激,因为我渴望摆脱情节提要的局限,并控制我的代码以正确地适应设备。
谢谢大家。