Ios 斯威夫特:这个放大玻璃视图类是如何工作的?

Ios 斯威夫特:这个放大玻璃视图类是如何工作的?,ios,swift,uiview,core-graphics,magnify,Ios,Swift,Uiview,Core Graphics,Magnify,在SO和GitHub中搜索,我发现了下面的Swift类,它作为一个放大镜,围绕用户触摸屏幕的点放大部分UIView。以下是我找到的代码: // // MagnifyingGlassView.swift // // Created by Roman Kyrylenko on 01/11/15. // Copyright (c) 2015 pr0ctopus.com All rights reserved. // import UIKit public class MagnifyingGl

在SO和GitHub中搜索,我发现了下面的Swift类,它作为一个放大镜,围绕用户触摸屏幕的点放大部分
UIView
。以下是我找到的代码:

//
//  MagnifyingGlassView.swift
//
//  Created by Roman Kyrylenko on 01/11/15.
//  Copyright (c) 2015 pr0ctopus.com All rights reserved.
//

import UIKit

public class MagnifyingGlassView: UIView {

  var viewToMagnify: UIView?
  var scale: CGFloat = 2.0
  var zoomedPoint:CGPoint?

  var size: CGFloat = 200.0 {
    didSet {
        let c = center
        frame = CGRectMake(c.x - size / 2, c.y - size / 2, size, size)
    }
  }

  var outlineColor: UIColor? {
    didSet {
        layer.borderColor = outlineColor?.CGColor
    }
  }

  var outlineWidth: CGFloat? {
    didSet {
        layer.borderWidth = outlineWidth ?? 0.0
    }
  }

  var touchPoint: CGPoint = CGPointZero {
    didSet {
        self.center = touchPoint
    }
  }

  required public init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    commonInit()
  }

  /*required public override init(frame: CGRect) {
    super.init(frame: frame)
    commonInit()
  }*/

  public init() {
    super.init(frame: CGRectMake(0, 0, size, size))
    commonInit()
  }

  public override func drawRect(rect: CGRect) {
    guard let context = UIGraphicsGetCurrentContext()
        else { return }

    /------!!!------/
    CGContextTranslateCTM(context, frame.size.width / 2, frame.size.height / 2)
    CGContextScaleCTM(context, scale, scale)
    CGContextTranslateCTM(context, -zoomedPoint!.x, -zoomedPoint!.y)
    /------!!!------/

    hidden = true
    viewToMagnify?.layer.renderInContext(context)

    /* color of axes */
    CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0)
    /* line width of axes */
    CGContextSetLineWidth(context, 0.5)

    /* draw vertical axis inside magnifier */
    CGContextMoveToPoint(context, self.zoomedPoint!.x , self.zoomedPoint!.y - (self.frame.size.height / 2))
    CGContextAddLineToPoint(context, self.zoomedPoint!.x, self.zoomedPoint!.y + (self.frame.size.height / 2))

    /* draw horizontal axis inside magnifier */
    CGContextMoveToPoint(context, self.zoomedPoint!.x - (self.frame.size.width / 2), self.zoomedPoint!.y)
    CGContextAddLineToPoint(context, self.zoomedPoint!.x + (self.frame.size.width / 2), self.zoomedPoint!.y)
    CGContextStrokePath(context)
    hidden = false

}

private func commonInit() {
    layer.cornerRadius = frame.size.width / 2
    self.outlineWidth = 2.0
    self.outlineColor = UIColor.lightGrayColor()
    self.size = 200.0
    layer.masksToBounds = true
}
}
我不理解的行是
/----之间包含的行------/。我的意思是,当放大镜的目的只是放大一个点周围的区域时,我不明白为什么需要这些翻译。为什么需要翻译两次?它们是什么意思?
有人能给我解释一下那东西是怎么工作的吗

到目前为止,我想我已经了解到的是,在第一次平移时,我们给了放大镜一个新的图形坐标参考系统,其原点是放大镜的中心,轴的长度是放大镜本身高度和宽度的一半。然后,我们执行缩放操作,将图形上下文缩放两倍,最后,通过另一次平移,再次设置图形的原点 放大镜图形坐标的参考系,即用户刚刚触摸屏幕的点。是这样吗