50行代码搞定放大镜

2017-02-09  本文已影响56人  晚雪浓情

虽然是2012年就有的功能了。。但是还是用swift3.0更新一下。一如既往的简单,不到50行就能搞定。

食用方法: 在控制器中添加如下代码即可

    fileprivate lazy var magnifier = MagnifierView()
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
    {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {[unowned self] in
            self.magnifier.makeKeyAndVisible()
        }
        magnifier.viewToMagnify = view.window
        //如果在View里使用,请去掉"view."即可
        magnifier.pointToMagnify = touches.first?.location(in: view.window)
    }
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
    {
        if !magnifier.isHidden
        {
            magnifier.pointToMagnify = touches.first?.location(in: view.window)
        }
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        magnifier.isHidden = true
    }
    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        magnifier.isHidden = true
    }

放大镜代码⬇️

class MagnifierView: UIWindow
{
    fileprivate static let magnifierWH:CGFloat = 120
    
    var viewToMagnify:UIView!
    
    var pointToMagnify:CGPoint!
    {
        didSet
        {
            center = CGPoint(x: pointToMagnify.x, y: pointToMagnify.y)
            contentLayer.setNeedsDisplay()
        }
    }

    fileprivate lazy var contentLayer:CALayer = {
    
        let layer = CALayer()
        layer.delegate = self
        layer.frame = self.bounds
        layer.contentsScale = UIScreen.main.scale
        
        return layer
    }()

    private override init(frame: CGRect)
    {
        super.init(frame: frame)
        
        backgroundColor = .clear
        layer.borderWidth = 1
        layer.borderColor = UIColor.lightGray.cgColor
        layer.cornerRadius = MagnifierView.magnifierWH * 0.5
        layer.masksToBounds = true
        windowLevel = UIWindowLevelAlert
        
        layer.addSublayer(contentLayer)
    }
    
    convenience init()
    {
        self.init(frame: CGRect(x: 0, y: 0, width: MagnifierView.magnifierWH, height: MagnifierView.magnifierWH))
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func draw(_ layer: CALayer, in ctx: CGContext) {

        ctx.translateBy(x: frame.size.width * 0.5, y: frame.size.height * 0.5)
        ctx.scaleBy(x: 1.2, y: 1.2)
        ctx.translateBy(x: -pointToMagnify.x, y: -pointToMagnify.y)
        
        viewToMagnify.layer.render(in: ctx)
    }
}
上一篇下一篇

猜你喜欢

热点阅读