完整斯威夫特游乐场举例
我能想到的最简单的例子是添加一个UIImageView
到UIScrollView
。这是100%的代码,你只需要添加一个PNG到游乐场。我打电话给我的Image.png
。在Playground中,您会看到'Live View'中呈现的整个事物。捏放大使用按住Ctrl单击将一个手指放在屏幕上,然后拖动。直到内容放大到大于屏幕平移不起作用。双击图像以在1x和3x比例之间切换。
基于苹果的Technical Note TN2154: UIScrollView and Autolayout
疑难杂症
你会发现整个事情很令人沮丧,如果你的内容并不比屏幕尺寸更大。如果您的内容完全符合屏幕,则不会发生任何事情这就是为什么你必须变焦才能工作。如果你想向自己证明它是有效的,那么测试一个非常大的图像(比窗口大)。
import UIKit
import PlaygroundSupport
enum TapToggle {
case Regular, Large
}
class ScrollingViewController : UIViewController
{
var tapToggle: TapToggle = .Large
var scrollView: UIScrollView?
var imageView: UIImageView?
override func viewDidLoad()
{
let image = UIImage(named: "Image")
let imageView = UIImageView(image: image)
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.backgroundColor = .white
imageView.isUserInteractionEnabled = true
let scrollView = UIScrollView()
scrollView.minimumZoomScale = 0.5
scrollView.maximumZoomScale = 10.0
scrollView.delegate = self
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(imageView)
let imageViewKey = "imageView"
let imageViews = [imageViewKey: imageView]
scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[\(imageViewKey)]|", options: [], metrics: nil, views: imageViews))
scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[\(imageViewKey)]|", options: [], metrics: nil, views: imageViews))
self.imageView = imageView
scrollView.backgroundColor = .white
self.view.addSubview(scrollView)
let scrollViewKey = "scrollView"
let scrollViews = [scrollViewKey: scrollView]
self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[\(scrollViewKey)]|", options: [], metrics: nil, views: scrollViews))
self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[\(scrollViewKey)]|", options: [], metrics: nil, views: scrollViews))
self.scrollView = scrollView
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didDoubleTap(sender:)))
tapGesture.numberOfTapsRequired = 2
self.imageView?.addGestureRecognizer(tapGesture)
}
@objc
public func didDoubleTap(sender: AnyObject)
{
switch self.tapToggle {
case .Regular:
self.scrollView?.zoomScale = 1.0
self.tapToggle = .Large
case .Large:
self.scrollView?.zoomScale = 3.0
self.tapToggle = .Regular
}
}
}
extension ScrollingViewController: UIScrollViewDelegate
{
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return self.imageView
}
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat)
{
print("\(scale)")
}
}
PlaygroundPage.current.needsIndefiniteExecution = true
PlaygroundPage.current.liveView = ScrollingViewController()
我知道你的意思。我有同样的问题。你弄明白了吗?这似乎与约束有关,我尝试在'scrollViewWillBeginZooming:withView:'中移除约束,并将它们放回到'scrollViewDidEndZooming:withView:atScale:'中,并且在缩放期间效果更好,但是在缩放内容在错误的地方。 – devguydavid
@david:不,我从来没有解决过这个问题。我的结论是,UIKit的各个部分与Auto Layout不兼容,因此我在这些情况下停止使用Auto Layout(特别是'UIScrollView'和'UIPageViewController')。 – phu
我也有这个问题。我有一个带有嵌入式图像视图的滚动视图,并且试图只允许简单缩放图像,并且它是全部时髦的,扭曲整个图像视图,同时在缩小视图的同时跳跃大小。希望有人会为此找到解决办法。 – JimmyJammed