放大UIScrollView后,如何重绘UIView并重置缩放比例?

时间:2019-03-29 19:19:50

标签: ios uiscrollview autolayout

我在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点宽,并且全部出现在视图中

Initial View

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行(加上一些空格)在视图中,不是我在捏放大后抬起手指之前的那四个。

After Zoom

如果我滚动视图,则视图的右边缘显示第4行,但第5行已从视图中消失

After zoom and scroll

调试输出为:

frame w: 320.8655518358761 Scale: 1.3369397993161503 Offset: 1.6666666666666665 Content: 320.8655518358761
Draw: frame: 320.8655518358761, bounds: 240.0

我曾尝试过以各种方式将缩放比例重置为1倍,但它们似乎都不起作用,因此所有5条线都在新的缩放视图中显示,并且可以左右滚动-我确定这是基本的滚动视图行为但我看不到如何使其按需工作。...

0 个答案:

没有答案
相关问题