请教:ScrollView 自动缩放包含n个座标

新手上路,请多包涵

在 ScrollView 中,选择随机排列几个按钮,
使用者缩放与移动 Offset 后,点选两个按钮
请问如何让 ScrollView 自动缩放与改变 Offset,使屏幕画面包含btn1btn2

以下是简易代码,以免我的语意不清
func setZoomScaleAndOffset()的部分求个思路,谢谢

import UIKit

class ViewController: UIViewController {
    var contentView: UIView!
    var scrollView: UIScrollView!
    var btn1: UIButton!
    var btn2: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        scrollView = UIScrollView(frame: self.view.frame)
        scrollView.delegate = self
        scrollView.contentSize = CGSize(width: 2000, height: 2000)
        contentView = UIView(frame: CGRect(x: 0, y: 0, width: 2000, height: 2000))
        scrollView.minimumZoomScale = 0.1
        scrollView.maximumZoomScale = 4.0
        scrollView.zoomScale = 1.0
        for index in 1...5 {
            let btn = UIButton(frame: CGRect(x: (1.0...2000.0).random(), y: (1.0...2000.0).random(), width: 50, height: 50))
            btn.setTitle("btn\(index)", for: .normal)
            btn.backgroundColor = .blue
            btn.tag = index
            btn.addTarget(self, action:  #selector(tap(_:)), for: .touchDown)
            contentView.addSubview(btn)
        }
        scrollView.addSubview(contentView)
        self.view.addSubview(scrollView)
    }
    func tap(_ sender: UIButton) {
        print(sender.frame)
        if btn1 == nil {
            btn1 = sender
            return
        }
        if btn2 == nil && sender != btn1{
            btn2 = sender
            setZoomScaleAndOffset()
            return
        }
    }
    
    func setZoomScaleAndOffset() {
        //变换 Offset 与 Scale 使两个按钮呈现在画面中
    }
}

extension ViewController: UIScrollViewDelegate {
    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return contentView
    }
}

extension ClosedRange where Bound : FloatingPoint {
    func random() -> Bound {
        let range = self.upperBound - self.lowerBound
        let randomValue = (Bound(arc4random_uniform(UINT32_MAX)) / Bound(UINT32_MAX)) * range + self.lowerBound
        return randomValue
    }
}
阅读 1.8k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题