2010-01-08 69 views
19

我希望能够在自定义视图中创建一个可移动的放大镜(如您在复制和粘贴时所具有的放大镜),以放大视图的一部分。iPhone,重现放大镜效果

我不知道如何开始,你有什么想法吗?

在此先感谢您的帮助:)

+0

有趣的问题。尽管我自己没有想法。 – 2010-01-08 21:11:20

回答

16

我们在填字游戏中执行此操作。在你的drawRect方法中,遮住一个圆圈(使用包含放大镜的'蒙版'的单色位图),并用2倍缩放变换在你的主题视图中绘制。然后画一个放大镜图像,你就完成了。

- (void) drawRect: (CGRect) rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGRect   bounds = self.bounds; 
    CGImageRef  mask = [UIImage imageNamed: @"loupeMask"].CGImage; 
    UIImage   *glass = [UIImage imageNamed: @"loupeImage"]; 

    CGContextSaveGState(context); 
    CGContextClipToMask(context, bounds, mask); 
    CGContextFillRect(context, bounds); 
    CGContextScaleCTM(context, 2.0, 2.0); 

    //draw your subject view here 

    CGContextRestoreGState(context); 

    [glass drawInRect: bounds]; 
} 
+0

听起来很有趣。我只需要添加一个覆盖层来尝试模仿反射。 我要测试它。非常感谢! – 2010-01-09 13:21:23

+0

工作正常。谢谢 – 2010-01-17 18:50:42

+0

该代码不支持未缩放区域的阴影!如何解决这个问题? – Dmitry 2012-11-11 17:13:03

4

有一个完整的例子over here。在下载的项目中有一个小错误,但否则它会很好,并且完全符合您的需求。

+0

+1分享链接 – Cyprian 2012-08-24 13:39:18

+0

您可以将相关位拖放到答案中吗?看起来这个链接仍然有效,但是不能保证这个链接会保持多久。 – 2015-05-31 07:26:28

1

我在斯威夫特3使用此代码:

class MagnifyingGlassView: UIView { 

    var zoom: CGFloat = 2 { 
     didSet { 
      setNeedsDisplay() 
     } 
    } 

    weak var readView: UIView? 

    // MARK: - UIVIew 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     setupView() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     setupView() 
    } 

    override func draw(_ rect: CGRect) { 
     guard let readView = readView else { return } 
     let magnifiedBounds = magnifyBounds(of: readView, zoom: zoom) 
     readView.drawHierarchy(in: magnifiedBounds, afterScreenUpdates: false) 
    } 

    // MARK: - Private 

    private func setupView() { 
     isOpaque = false 
     backgroundColor = UIColor.clear 
    } 

    private func magnifyBounds(of view: UIView, zoom: CGFloat) -> CGRect { 
     let transform = CGAffineTransform(scaleX: zoom, y: zoom) 
     var bounds = view.bounds.applying(transform) 
     bounds.center = view.bounds.center 
     return view.convert(bounds, to: self) 
    } 
} 

extension CGRect { 
    var center: CGPoint { 
     get { 
      return CGPoint(x: origin.x + width/2, y: origin.y + height/2) 
     } 
     set { 
      origin.x = newValue.x - width/2 
      origin.y = newValue.y - height/2 
     } 
    } 
} 

你需要调用setNeedsDisplayscrollViewDidScroll:如果你读的视图是一个滚动视图。