gpt4 book ai didi

ios - 如何使用 swift 3.0 使用单指一次旋转和调整 View 大小

转载 作者:行者123 更新时间:2023-12-01 19:48:45 24 4
gpt4 key购买 nike

我想在 swift 3.0 中使用单指一次旋转和调整 View 大小我在 中找到了许多解决方案 objective-c 但我坚持将其转换为 swift。我已将以下代码用于 旋转 View

    let panRotateGesture = UIPanGestureRecognizer(target: self, action: #selector(self.rotateViewPanGesture))
rotateView?.addGestureRecognizer(panRotateGesture)
panRotateGesture.require(toFail: panRotateGesture)
textView?.addSubview(rotateView!)

RotateViewPanGesture 函数
func rotateViewPanGesture(_ recognizer: UIPanGestureRecognizer) {

if recognizer.state == .began {

deltaAngle = atan2(Float(recognizer.location(in: textView).y - textView!.center.y), Float(recognizer.location(in: textView).x - textView!.center.x))
startTransform = (textView?.transform)!

} else if recognizer.state == .changed {

let ang: Float = atan2(Float(recognizer.location(in: textView!.superview).y - textView!.center.y), Float(recognizer.location(in: textView!.superview).x - textView!.center.x))
let angleDiff: Float = deltaAngle - ang
textView?.transform = CGAffineTransform(rotationAngle: -(CGFloat)(angleDiff))
textView?.setNeedsDisplay()

} else if recognizer.state == .ended {

deltaAngle = atan2(Float(recognizer.location(in: textView).y - textView!.center.y), Float(recognizer.location(in: textView).x - textView!.center.x))
startTransform = (textView?.transform)!
textView?.setNeedsDisplay()

}

}

这里 文本查看 是我想要的 旋转 调整大小 .

以下是我的 代码调整 View 大小
    func resizeViewPanGesture(_ recognizer: UIPanGestureRecognizer) {

let translation = recognizer.translation(in: recognizer.view)

if let view = recognizer.view {
view.transform = (textView?.transform.translatedBy(x: translation.x, y: translation.y))!
}

recognizer.setTranslation(CGPoint.zero, in: recognizer.view)
}

}

但它不适合我。有人请帮我解决这个问题,我如何在 swift 3 中一次使用单指旋转和调整 View 大小

最佳答案

我已经使用以下代码解决了我的问题。它帮助我用一根手指旋转和调整图像大小。

 func stickerResizeGesture(_ recognizer: UIPanGestureRecognizer) {

let superview = recognizer.view?.superview

stickerContainerView = superview

for element in (superview?.subviews)! {

if element.accessibilityHint == "Main Image" {
imgSticker = element as! UIImageView
}

if element.accessibilityHint == "Delete" {
deleteView = element as? UIImageView
}

if element.accessibilityHint == "Rotate" {
rotateView = element as? UIImageView
}

if element.accessibilityHint == "Resize" {
resizeView = element as? UIImageView
}
}

let touchLocation = recognizer.location(in: stickerContainerView?.superview)

let center = CalculateFunctions.CGRectGetCenter((stickerContainerView?.frame)!)

if recognizer.state == .began {

prevPoint = recognizer.location(in: stickerContainerView?.superview)


//Rotate
deltaAngle = Float(atan2(touchLocation.y - center.y, touchLocation.x - center.x) - CalculateFunctions.CGAffineTrasformGetAngle(self.startTransform))

initialBounds = stickerContainerView?.bounds

initialDistance = CalculateFunctions.CGpointGetDistance(center, point2: touchLocation)
//stickerContainerView?.setNeedsDisplay()


} else if recognizer.state == .changed {

if (stickerContainerView?.bounds.size.width)! < CGFloat(100.0) {


stickerContainerView?.bounds = CGRect(x: (stickerContainerView?.bounds.origin.x)!,
y: (stickerContainerView?.bounds.origin.y)!,
width: (stickerContainerView?.bounds.size.width)!,
height: (stickerContainerView?.bounds.size.width)!)

imgSticker.frame = CGRect(x: 12,
y: 12,
width: (stickerContainerView?.bounds.size.width)! - (resizeView?.frame.width)!,
height: (stickerContainerView?.bounds.size.height)! - (resizeView?.frame.height)!)

resizeView?.frame = CGRect(x: (stickerContainerView?.bounds.size.width)! - (resizeView?.frame.width)!,
y: (stickerContainerView?.bounds.size.height)! - (resizeView?.frame.height)!,
width: (resizeView?.frame.width)!,
height: (resizeView?.frame.height)!)


rotateView?.frame = CGRect(x: 0,
y: (stickerContainerView?.bounds.size.height)! - (rotateView?.frame.height)!,
width: (rotateView?.frame.width)!,
height: (rotateView?.frame.height)!)

deleteView?.frame = CGRect(x: 0,
y: 0,
width: (deleteView?.frame.width)!,
height: (deleteView?.frame.height)!)

} else if (stickerContainerView?.bounds.size.height)! < CGFloat(100.0) {

stickerContainerView?.bounds = CGRect(x: (stickerContainerView?.bounds.origin.x)!,
y: (stickerContainerView?.bounds.origin.y)!,
width: (stickerContainerView?.bounds.size.height)!,
height: (stickerContainerView?.bounds.size.height)!)


imgSticker.frame = CGRect(x: 12, y: 12,
width: (stickerContainerView?.bounds.size.width)! - (resizeView?.frame.width)!,
height: (stickerContainerView?.bounds.size.height)! - (resizeView?.frame.height)!)

resizeView?.frame = CGRect(x: (stickerContainerView?.bounds.size.width)! - (resizeView?.frame.width)!,
y: (stickerContainerView?.bounds.size.height)! - (resizeView?.frame.height)!,
width: (resizeView?.frame.width)!,
height: (resizeView?.frame.height)!)

rotateView?.frame = CGRect(x: 0, y: (stickerContainerView?.bounds.size.height)! - (rotateView?.frame.height)!,
width: (rotateView?.frame.width)!,
height: (rotateView?.frame.height)!)

deleteView?.frame = CGRect(x: 0,
y: 0,
width: (deleteView?.frame.width)!,
height: (deleteView?.frame.height)!)

} else {

let point: CGPoint = recognizer.location(in: stickerContainerView!.superview)

let newHeight = (stickerContainerView?.bounds.size.width)! + CGFloat(point.y - prevPoint.y)
let newWidth = (stickerContainerView?.bounds.size.height)! + CGFloat(point.y - prevPoint.y)

if newHeight < CGFloat(100.0) && newWidth < CGFloat(100.0) {

stickerContainerView?.bounds = CGRect(x: stickerContainerView!.bounds.origin.x,
y: stickerContainerView!.bounds.origin.y,
width: 100.0,
height: 100.0)


} else {

stickerContainerView?.bounds = CGRect(x: stickerContainerView!.bounds.origin.x,
y: stickerContainerView!.bounds.origin.y,
width: newWidth,
height: newHeight)

}


imgSticker.frame = CGRect(x: 12,
y: 12,
width: (stickerContainerView?.bounds.size.width)! - (resizeView?.frame.width)!,
height: (stickerContainerView?.bounds.size.height)! - (resizeView?.frame.height)!)

resizeView?.frame = CGRect(x: (stickerContainerView?.bounds.size.width)! - (resizeView?.frame.width)!,
y: (stickerContainerView?.bounds.size.height)! - (resizeView?.frame.height)!,
width: (resizeView?.frame.width)!,
height: (resizeView?.frame.height)!)

rotateView?.frame = CGRect(x: 0,
y: (stickerContainerView?.bounds.size.height)! - 25,
width: (rotateView?.frame.width)!,
height: (rotateView?.frame.height)!)

deleteView?.frame = CGRect(x: 0,
y: 0,
width: (deleteView?.frame.width)!,
height: (deleteView?.frame.height)!)

prevPoint = recognizer.location(in: stickerContainerView?.superview)

}

// Rotate

let ang: Float = atan2(Float(touchLocation.y - center.y), Float(touchLocation.x - center.x))

let angleDiff = deltaAngle - ang

stickerContainerView?.transform = CGAffineTransform(rotationAngle: -(CGFloat)(angleDiff))
stickerContainerView?.setNeedsDisplay()


} else if recognizer.state == .ended {


prevPoint = recognizer.location(in: stickerContainerView?.superview)

//Rotate

let ang: Float = atan2(Float(touchLocation.y - center.y), Float(touchLocation.x - center.x))
startTransform = (stickerContainerView?.transform)!

// stickerContainerView?.setNeedsDisplay()


}

}

关于ios - 如何使用 swift 3.0 使用单指一次旋转和调整 View 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46932449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com