我正在使用UIPinchGestureRecognizer来调整我的应用中的视图帧。我想独立调整高度和宽度(视图是对齐网格上的矩形),因此我需要确定是否要修改高度或宽度。
最初我尝试使用两点之间的斜率,正如许多SO帖子所暗示的那样。像这样:
enum ScalingType {
case widthOnly, heightOnly, widthAndHeight
}
private func determineScaling(loc1: CGPoint, loc2: CGPoint) -> ScalingType {
let dx = abs(loc1.x - loc2.x)
let dy = abs(loc1.y - loc2.y)
if dx > dy {
return .widthOnly
} else {
return .heightOnly
}
}
虽然这适用于大多数形状,但是当形状在任一维度上变得非常窄时它都不起作用。例如,如果我想调整高度较短且宽度较长的矩形的高度,手指将垂直移动,但手指的水平距离可能比垂直高。
是否有最好的方法来获取(例如)捏合手势中的点的平移或某种方式来确定手指移动的方向?
由于
答案 0 :(得分:1)
我猜你正在遇到狭窄的宽度或高度小于44的情况(44是Apple的建议指南,显然是指手指接触的像素数)。我建议完全丢弃UIPinchGesture并使用UIPanGesture代替。请记住,它会改变功能。您可以将各个侧面拖放到比例尺(这类似于在iPhone的照片库中裁剪图片时发生的情况),而不是按比例缩放。通过使用这种方法,如果宽度或高度较窄,您不必担心两根手指太近(对于捏)并弄乱数学
答案 1 :(得分:0)
这是用于确定捏合是更水平还是更垂直的 Swift 代码。
当它更水平时,宽度因子会增加或减少。
当它更垂直时,高度系数会增加或减少。
给出下面的func声明
@objc func handlePinch(pinch: UIPinchGestureRecognizer)
然后在该函数的主体中,检查是否存在用于捏合的 2 个触摸点以避免崩溃。
然后检查 X 和 Y 方向的增量大小。
当手指分开的时候效果非常好。
if pinch.numberOfTouches < 2 {
print("don't crash")
return
}
var touchPoint1 = pinch.location(ofTouch: 0, in: self.view)
var touchPoint2 = pinch.location(ofTouch: 1, in: self.view)
let deltaX = abs(touchPoint1.x - touchPoint2.x)
let deltaY = abs(touchPoint1.y - touchPoint2.y)
if deltaX > deltaY
{
dropRectangleCurrentWidth *= pinch.scale
}
else
{
dropRectangleCurrentHeight *= pinch.scale
}
pinch.scale = 1