2010-01-08 17 views
19

Görünümümün bir bölümünü yakınlaştırmak için özel bir görünümde hareketli bir büyüteç (kopyaladığınız ve yapıştırdığınız zamanki gibi) oluşturmak istiyorum.iPhone, büyüteç efektini yeniden üretir

Nasıl başlayacağımı bilmiyorum, herhangi bir fikrin var mı? peşin

Yardımlarınız için teşekkürler :)

+0

İlginç bir soru. Yine de hiçbir fikrim yok. –

cevap

16

için biz Crosswords yapıyoruz. DrawRect yönteminizde bir daireyi (büyüteçinizin maskesini içeren tek renkli bir bitmap kullanarak) maskeleyin ve konu görünümünüzü 2x ölçekli bir dönüşümle oraya çekin. Sonra bunun üzerinde bir büyüteç görüntüsü çizin ve işin bitti.

- (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

Çok ilginç geliyor. Yansıtmayı taklit etmeye çalışmak için bir yer paylaşımı eklemem gerekecek. Bunu test edeceğim. Çok teşekkürler! –

+0

İyi çalışıyor. Teşekkürler –

+0

Kod, ölçeklenmemiş alanda bir gölgeyi desteklemiyor! Bunu nasıl düzeltebilirim? – Dmitry

4

Tam bir örnek over here var. İndirilen projede küçük bir hata var, ancak aksi halde harika çalışıyor ve tam olarak ihtiyacınız olanı yapıyor.

+0

+1 bağlantıyı paylaştığınız için – Cyprian

+0

İlgili bitleri yanıtlara ayırabilir misiniz? Bağlantı hala çalışıyor gibi görünüyor, ancak bunun ne kadar süre geçerli kalacağı konusunda bir garanti yok. –

1

Ben Swift 3'te bu kodu kullanın:

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 
     } 
    } 
} 

Sen okuma görünümü bir scrollview ise scrollViewDidScroll: yılında setNeedsDisplay çağırmanız gerekir.

İlgili konular