2010-01-08 12 views
19

पुन: उत्पन्न करें, मैं अपने दृश्य के एक भाग को ज़ूम करने के लिए एक कस्टम दृश्य में एक जंगम आवर्धक (जैसा कि आप कॉपी और पेस्ट करते हैं) बनाने में सक्षम होना चाहते हैं।आईफोन, आवर्धक प्रभाव

मुझे नहीं पता कि कैसे शुरू करना है, क्या आपको कोई विचार है?

आपकी मदद के लिए अग्रिम धन्यवाद :)

+0

दिलचस्प सवाल। हालांकि कोई विचार खुद नहीं है। –

उत्तर

16

हम इसे क्रॉसवर्ड में करते हैं। अपनी drawRect विधि में, एक सर्कल से मुखौटा (एक मोनोक्रोम बिटमैप का उपयोग करके जिसमें आपके आवर्धक ग्लास के 'मास्क' होते हैं) और 2x स्केल ट्रांसफॉर्म के साथ वहां अपना विषय दृश्य खींचें। फिर उस पर एक आवर्धक ग्लास छवि खींचें और आप कर चुके हैं।

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

वास्तव में दिलचस्प लगता है। प्रतिबिंब की नकल करने की कोशिश करने के लिए मुझे केवल ओवरले जोड़ने की आवश्यकता होगी। मैं इसका परीक्षण करने जा रहा हूं। आपका बहुत बहुत धन्यवाद! –

+0

अच्छी तरह से काम करता है। धन्यवाद –

+0

कोड असंसक्षित क्षेत्र पर एक छाया का समर्थन नहीं करता है! इसे कैसे ठीक करें? – Dmitry

4

एक पूर्ण उदाहरण over here है। डाउनलोड की गई परियोजना में एक मामूली त्रुटि है लेकिन अन्यथा यह बहुत अच्छा काम करता है और आपको वही करता है जो आपको चाहिए।

+0

+1 लिंक साझा करने के लिए +1 – Cyprian

+0

क्या आप प्रासंगिक बिट्स को उत्तर में खींच सकते हैं? ऐसा लगता है कि लिंक अभी भी काम करता है, लेकिन इस बात की कोई गारंटी नहीं है कि यह कब तक सच रहेगा। –

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

आप scrollViewDidScroll: में setNeedsDisplay कॉल करने के लिए अगर आपके पढ़ने के लिए दृश्य एक scrollview है की जरूरत है।

संबंधित मुद्दे