iPhone,重现放大镜效果
我希望能够在自定义视图中创建一个可移动的放大镜(就像复制和粘贴时的放大镜),用于缩放视图的一部分 我不知道怎么开始,你知道吗iPhone,重现放大镜效果,iphone,uiview,Iphone,Uiview,我希望能够在自定义视图中创建一个可移动的放大镜(就像复制和粘贴时的放大镜),用于缩放视图的一部分 我不知道怎么开始,你知道吗 提前感谢您的帮助:)我们在纵横填字游戏中这样做。在drawRect方法中,遮罩掉一个圆(使用包含放大镜“遮罩”的单色位图),然后使用2倍比例变换在其中绘制对象视图。然后在上面画一个放大镜图像,就完成了 - (void) drawRect: (CGRect) rect { CGContextRef context = UIGraphicsGetCurrentC
提前感谢您的帮助:)我们在纵横填字游戏中这样做。在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];
}
有一个完整的例子。下载的项目中有一个小错误,但除此之外,它运行良好,完全符合您的需要。我在Swift 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
}
}
}
如果阅读视图是滚动视图,则需要在
scrollViewDidScroll:
中调用setNeedsDisplay
有趣的问题。我自己也不知道。听起来真的很有趣。我只需要添加一个覆盖层来模拟反射。我要测试一下。谢谢!代码不支持未缩放区域上的阴影!如何修复此问题?链接到完整代码(由于上面的代码不完全正确,因此不支持shadow):谢谢,您有任何源代码吗?或者是样本项目?你能把相关的部分放到答案中吗?看起来这个链接仍然有效,但不能保证它能保持多久。