5

我想实现一个可调整大小和可拖动的 UIView,如下图所示:

在此处输入图像描述

这是我到目前为止使用简单的手势识别器实现的类:

class PincherView: UIView {

var pinchRec:UIPinchGestureRecognizer!
var rotateRec:UIRotationGestureRecognizer!
var panRec:UIPanGestureRecognizer!
var containerView:UIView!

init(size: CGRect, container:UIView) {
    super.init(frame: size)

    self.containerView = container

    self.pinchRec = UIPinchGestureRecognizer(target: self, action: "handlePinch:")
    self.addGestureRecognizer(self.pinchRec)

    self.rotateRec = UIRotationGestureRecognizer(target: self, action: "handleRotate:")
    self.addGestureRecognizer(self.rotateRec)

    self.panRec = UIPanGestureRecognizer(target: self, action: "handlePan:")
    self.addGestureRecognizer(self.panRec)

    self.backgroundColor = UIColor(red: 0.0, green: 0.6, blue: 1.0, alpha: 0.4)
    self.userInteractionEnabled = true
    self.multipleTouchEnabled = true
    self.hidden = false
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

func handlePinch(recognizer : UIPinchGestureRecognizer) {
    if let view = recognizer.view {
        view.transform = CGAffineTransformScale(view.transform, 1.0, recognizer.scale)
        //view.transform = CGAffineTransformScale(view.transform, recognizer.scale, recognizer.scale)
        recognizer.scale = 1
    }
}

func handleRotate(recognizer : UIRotationGestureRecognizer) {
    if let view = recognizer.view {
        view.transform = CGAffineTransformRotate(view.transform, recognizer.rotation)
        recognizer.rotation = 0
    }
}

func handlePan(recognizer:UIPanGestureRecognizer) {
    let translation = recognizer.translationInView(containerView)
    if let view = recognizer.view {
        view.center = CGPoint(x:view.center.x + translation.x,
            y:view.center.y + translation.y)
    }
    recognizer.setTranslation(CGPointZero, inView: containerView)
}

}

正如您可以想象的那样,使用简单UIPinchGestureRecognizer的 uiview 在 x 和 y 方向上均等地缩放,但我希望用户有机会尽可能精确,以便他们甚至可以在一个方向上缩放或改变形式uiview,不一定是矩形。此外,对我来说更重要的是用户在设置uiview的高度时尽可能精确这就是为什么我需要在角落有这 4 个按钮的原因。我只是想让你给我一些提示,从哪里开始以及如何开始。谢谢

更新 这是我已经知道的

在此处输入图像描述

通过这种方式,我有以下层次结构:

-UIImageView嵌入 -UIView嵌入 -UIScrollView嵌入 -UIViewController

我必须添加一个进一步UIView用作容器,以便它包含的所有子 uiview 将与图片一起放大/缩小,以便具有更高的精度,以便更好地将 azure uiview 重叠到拍摄对象。关于引脚,白色的小圆圈,这是我尝试实现的类:

class PinImageView: UIImageView {

var lastLocation:CGPoint!
var container:UIView!
var viewToScale:UIView!
var id:String!

init(imageIcon: UIImage?, location:CGPoint, container:UIView, viewToScale:UIView, id:String) {

    super.init(image: imageIcon)
    self.lastLocation = location

    self.frame = CGRect(x: location.x, y: location.y, width: 10.0, height: 10.0)
    self.center = location

    self.userInteractionEnabled = true

    self.container = container
    self.viewToScale = viewToScale
    self.id = id
    self.hidden = false
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

func getScaleParameters(arrivalPoint:CGPoint) -> (sx:CGFloat, sy:CGFloat) {

    //var result:(sx:CGFloat, sy:CGFloat) = (1.0, 1.0)
    var scaleX:CGFloat = 1.0
    var scaleY:CGFloat = 1.0

    switch (self.id) {
    case "up_left":
        /* up_left is moving towards right*/
        if (self.lastLocation.x < arrivalPoint.x) {
            scaleX = -0.99
        }
        /* up_left is moving towards left*/
        else {
            scaleX = 0.9
        }
        /* up_left is moving towards up*/
        if (self.lastLocation.y < arrivalPoint.y) {
            scaleY = -0.9
        }
        /* up_left is moving towards down*/
        else {
            scaleY = 0.9
        }
        break
    default:
        scaleX = 1.0
        scaleY = 1.0
    }

    return (scaleX, scaleY)

}

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch: UITouch = touches.first {
        let scaleParameters:(sx:CGFloat, sy:CGFloat) = self.getScaleParameters(touch.locationInView(self.container))
        self.viewToScale.transform = CGAffineTransformMakeScale(scaleParameters.sx, scaleParameters.sy)
        //self.center = touch.locationInView(self.container)
        self.center = touch.locationInView(self.container)
        self.lastLocation = touch.locationInView(self.container)
    }
}

}

蔚蓝的浮动uiview在哪里viewToScale调用pincherViewRec。开头的引脚中心在pincherViewRec.frame.origin. 说它没有按预期工作是没有用的。你有什么主意吗?任何提示将不胜感激,以帮助我找到正确的方法。

4

0 回答 0