quito - mensajes con efectos iphone
iPhone, reproduce el efecto lupa. (3)
Hacemos esto en Crucigramas. En tu método drawRect, enmascara un círculo (usando un mapa de bits monocromático que contiene la "máscara" de tu lupa) y dibuja tu vista de sujeto allí con una transformación de escala 2x. Luego dibuja una imagen de lupa sobre eso y listo.
- (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];
}
Me gustaría poder crear una lupa móvil (como la que tiene cuando copia y pega) en una vista personalizada, para ampliar una parte de mi vista.
No tengo idea de cómo empezar, ¿tienes alguna idea?
Gracias de antemano por tu ayuda :)
Hay un ejemplo completo aquí . Hay un pequeño error en el proyecto descargado, pero por lo demás, funciona muy bien y hace exactamente lo que necesita.
Yo uso este código en 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
}
}
}
setNeedsDisplay
llamar a setNeedsDisplay
en scrollViewDidScroll:
si su vista de lectura es scrollView.