Swift:这个MagnifyingGlassView类是如何工作的?

时间:2016-02-16 16:34:31

标签: ios swift uiview core-graphics magnify

在这里搜索SO和GitHub我发现了以下Swift类,它使用magnifer来放大用户触摸屏幕周围的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
}
}

我不理解的行是/------!!!------/之间的行。我的意思是我不明白为什么当放大镜的目的只是放大一个点周围的区域时需要那些翻译。为什么需要翻译两次?他们的意思是什么? 有人会解释我这些东西是如何起作用的吗?

我认为到目前为止我所理解的是第一次翻译我们给放大镜一个新的图形坐标参考系统,其原点是放大镜的中心,轴的长度是放大镜本身高度的一半和宽度的一半。然后我们执行缩放操作以缩放两次图形上下文,最后,通过另一个翻译,我们再次设置了原点 作为用户刚刚触摸屏幕的点的放大镜的图形坐标的参考系统。这是对的吗?

0 个答案:

没有答案