【发布时间】:2016-03-19 09:58:39
【问题描述】:
我在UIScrollView 中有一个UIImageView。最终目标是在UIScrollView 的范围内旋转、平移和缩放图像。平移和缩放效果很好。旋转最初是有效的,但是在旋转完成后,然后是捏缩放,图像旋转被重置为 0,并且图像被移出UIScrollView。
对我可能遗漏的任何建议
@IBOutlet weak var innerScrollView: UIScrollView!
private weak var innerImageView: UIImageView?
var beforeImage: UIImage?
// MARK: -
// MARK: UIViewController
override func viewDidLoad() {
super.viewDidLoad()
innerScrollView.delegate = self
configureScrollView(innerScrollView, image: beforeImage)
let recognizer = UIRotationGestureRecognizer(target: self, action: "rotateRecognizer:")
if let imageView = innerImageView {
imageView.addGestureRecognizer(recognizer)
}
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
resetScrollView(innerScrollView)
}
// MARK: -
// MARK: Private Helpers
private func resetScrollView(scrollView: UIScrollView) {
let scaleWidth = scrollView.frame.size.width / scrollView.contentSize.width
let scaleHeight = scrollView.frame.size.height / scrollView.contentSize.height
let minScale = min(scaleHeight, scaleWidth)
scrollView.minimumZoomScale = minScale
scrollView.maximumZoomScale = 1.0
scrollView.zoomScale = minScale
centerScrollViewContents()
}
private func configureScrollView(scrollView: UIScrollView, image: UIImage?) {
guard let img = image else {
return
}
let imageView = UIImageView(image: image)
imageView.userInteractionEnabled = true
imageView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: img.size)
scrollView.addSubview(imageView)
scrollView.contentSize = img.size
innerImageView = imageView
}
private func centerScrollViewContents() {
let boundsSize = innerScrollView.bounds.size
var contentsFrame = innerImageView!.frame
if contentsFrame.size.width < boundsSize.width {
contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0
} else {
contentsFrame.origin.x = 0.0
}
if contentsFrame.size.height < boundsSize.height {
contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0
} else {
contentsFrame.origin.y = 0.0
}
innerImageView!.frame = contentsFrame
}
func rotateRecognizer(recognizer: UIRotationGestureRecognizer) {
print("The content Offset is \(innerScrollView.contentOffset)")
guard let recView = recognizer.view else {
return
}
recView.transform = CGAffineTransformRotate(recView.transform, recognizer.rotation);
recognizer.rotation = 0;
}
// MARK: -
// MARK: UIGestureRecognizer Delegate Protocol
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
if let imageView = scrollView.subviews.first as? UIImageView {
return imageView
}
return nil
}
【问题讨论】:
-
所以发布您的平移手势识别器代码。这很可能是问题所在。我敢打赌,您是从身份转换开始,而不是从图像视图的当前转换开始。 (您的旋转方法正在做正确的事情并从当前变换开始。)
-
@DuncanC 好吧,我没有平移或捏合手势识别器。我正在使用 UIScrollView。你认为这是问题所在吗?
-
你不应该旋转innerImageView,而不是“recView”吗?
-
如果您正在操作滚动视图的转换,那么是的,这很可能是问题所在。您可能应该将旋转应用于图像视图,而不是滚动视图。 (虽然让旋转中心正常工作可能是一个挑战。)
标签: ios uiscrollview uiimageview uigesturerecognizer