我在UIScrollView中有一个自定义UIView,我希望在其中进行2种缩放操作: 1)内容大小应增加,使其不适合滚动视图的范围,并且用户可以滚动缩放视图以查看内容 2)缩放后视图应重新绘制,以使线条保持原始大小,而不是通过缩放而变宽(即缩放后不保留为变换后的视图)
我尝试使用的方法是在缩放完成后重置视图的框架(以及UIScrollView的contentSize),然后重绘UIView,但是我尝试了多种方法,但没有一种方法能产生理想的效果。
潜在的问题是,一旦重置frame和contentSize并重新绘制视图,UIScrollView就会显示视图仍在缩放。然后,显而易见的方法是将UIScrollView zoomScale设置回1.0,但我无法正常工作并正确呈现更新的scrollView
我的测试示例中的基本设置是一个视图控制器,其中心是一个UIScrollView('scrollView')。 UIScrollView在中心240点宽处包含一个UIView('TestView')。这些都是根据Apple的建议进行设置的。为了清楚起见,我只专注于视图的宽度
UIView有一个简单的draw()函数,该函数绘制等间距(即相隔60个点)的5条垂直线。当视图首次出现时,所有线都被绘制为4点宽,并且全部出现在视图中
ViewController:
class ViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var testView: TestView!
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
scrollView.minimumZoomScale = 1.0
scrollView.maximumZoomScale = 5.0
}
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return testView
}
func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
print("frame w: \(testView.frame.width) Scale: \(scale) Offset: \(scrollView.contentOffset.x) Content: \(scrollView.contentSize.width)")
testView.setNeedsDisplay()
}
}
查看:
class TestView: UIView {
override func draw(_ rect: CGRect) {
let drawRect = CGRect(x: 0, y: 0, width: frame.width, height: frame.height)
print("Draw: frame: \(frame.width), bounds: \(bounds.width)")
let lineColour = [UIColor.blue, UIColor.green, UIColor.darkGray,UIColor.red,UIColor.cyan,UIColor.brown]
for i in 0...4 {
let x = drawRect.width / 4.0 * CGFloat(i)
let path = UIBezierPath()
path.move(to: CGPoint(x: x, y: 0))
path.addLine(to: CGPoint(x: x, y: drawRect.height))
lineColour[i].setStroke()
path.lineWidth = 4.0
path.stroke()
}
}
}
如果缩放,则显示4条线(1.33倍),这些线会分开并变宽(如预期)。缩放完成并在视图上执行draw()时,它将以正确的线宽绘制新帧,但是UIScrollView随后显示以1.33x缩放的新内容,因此仅显示3行(加上一些空格)在视图中,不是我在捏放大后抬起手指之前的那四个。
如果我滚动视图,则视图的右边缘显示第4行,但第5行已从视图中消失
调试输出为:
frame w: 320.8655518358761 Scale: 1.3369397993161503 Offset: 1.6666666666666665 Content: 320.8655518358761
Draw: frame: 320.8655518358761, bounds: 240.0
我曾尝试过以各种方式将缩放比例重置为1倍,但它们似乎都不起作用,因此所有5条线都在新的缩放视图中显示,并且可以左右滚动-我确定这是基本的滚动视图行为但我看不到如何使其按需工作。...