Swift 中 UIPanGestureRecognizer 的奇怪问题
Strange issue with UIPanGestureRecognizer in Swift
我正在尝试将平移手势添加到我的视图中,但我不知道为什么它不想工作。这是我的 UIView 的代码:
self.infoView = UIView()
self.mapView.addSubview(infoView)
infoView.backgroundColor = .white
infoView.layer.cornerRadius = 10.0
infoView.layer.masksToBounds = true
infoView.isUserInteractionEnabled = true
infoView.translatesAutoresizingMaskIntoConstraints = false
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(self.moveInfoView(recognizer:)))
infoView.addGestureRecognizer(panGesture)
我在 UIViewController
中将其定义为:
var infoView: UIView!
我的平移手势方法如下所示:
@objc func moveInfoView(recognizer:UIPanGestureRecognizer) {
let translation = recognizer.translation(in: self.view)
if let view = recognizer.view {
view.center = CGPoint(x:view.center.x + translation.x,
y:view.center.y + translation.y)
}
recognizer.setTranslation(CGPoint.zero, in: self.view)
}
我真的看不出我的错误。那里似乎一切都是正确的,但似乎我错了。你能指出我的错误吗?
更新
我的约束:
let constraints = [
// InfoView constraints
NSLayoutConstraint(item: infoView, attribute: .bottom, relatedBy: .equal, toItem: self.view.safeAreaLayoutGuide, attribute: .bottom, multiplier: 1.0, constant: 0.0),
NSLayoutConstraint(item: infoView, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1.0, constant: 0.0),
NSLayoutConstraint(item: infoView, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1.0, constant: 0.0),
infoViewHeightConstraint]
其中
let infoViewHeightConstraint = infoView.heightAnchor.constraint(greaterThanOrEqualToConstant: 112.0)
我怀疑问题出在您的视图是 GMSMapView
的子视图。地图视图已经添加了一堆手势识别器,并且手势识别器回调被发送到 GMSMapView
实例而不是您的子视图。虽然在 GMSMapView
上有一个 settings
属性 可以让您配置地图的用户界面设置。尝试使用以下代码启用手势:
self.mapView.settings.consumesGesturesInView = false
您还可以在那里自定义其他设置。希望这有帮助
我正在尝试将平移手势添加到我的视图中,但我不知道为什么它不想工作。这是我的 UIView 的代码:
self.infoView = UIView()
self.mapView.addSubview(infoView)
infoView.backgroundColor = .white
infoView.layer.cornerRadius = 10.0
infoView.layer.masksToBounds = true
infoView.isUserInteractionEnabled = true
infoView.translatesAutoresizingMaskIntoConstraints = false
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(self.moveInfoView(recognizer:)))
infoView.addGestureRecognizer(panGesture)
我在 UIViewController
中将其定义为:
var infoView: UIView!
我的平移手势方法如下所示:
@objc func moveInfoView(recognizer:UIPanGestureRecognizer) {
let translation = recognizer.translation(in: self.view)
if let view = recognizer.view {
view.center = CGPoint(x:view.center.x + translation.x,
y:view.center.y + translation.y)
}
recognizer.setTranslation(CGPoint.zero, in: self.view)
}
我真的看不出我的错误。那里似乎一切都是正确的,但似乎我错了。你能指出我的错误吗?
更新
我的约束:
let constraints = [
// InfoView constraints
NSLayoutConstraint(item: infoView, attribute: .bottom, relatedBy: .equal, toItem: self.view.safeAreaLayoutGuide, attribute: .bottom, multiplier: 1.0, constant: 0.0),
NSLayoutConstraint(item: infoView, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1.0, constant: 0.0),
NSLayoutConstraint(item: infoView, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1.0, constant: 0.0),
infoViewHeightConstraint]
其中
let infoViewHeightConstraint = infoView.heightAnchor.constraint(greaterThanOrEqualToConstant: 112.0)
我怀疑问题出在您的视图是 GMSMapView
的子视图。地图视图已经添加了一堆手势识别器,并且手势识别器回调被发送到 GMSMapView
实例而不是您的子视图。虽然在 GMSMapView
上有一个 settings
属性 可以让您配置地图的用户界面设置。尝试使用以下代码启用手势:
self.mapView.settings.consumesGesturesInView = false
您还可以在那里自定义其他设置。希望这有帮助