2011-08-29 17 views
11

मेरे पास [UIButton buttonWithType:UIButtonTypeCustom] है जिसमें एक छवि (या एक पृष्ठभूमि छवि - एक ही समस्या है) [UIImage imageWithContentsOfFile:] द्वारा बनाई गई है जो कैमरे द्वारा ली गई जेपीजी फ़ाइल को इंगित करती है और एप्लिकेशन द्वारा दस्तावेज़ फ़ोल्डर में सहेजी जाती है।UIButton छवि रोटेशन समस्या

यदि मैं केवल UIControlStateNormal के लिए छवि को परिभाषित करता हूं, तो जब मैं बटन को स्पर्श करता हूं तो छवि अपेक्षित के रूप में गहरा हो जाती है, लेकिन यह 90 डिग्री या 180 डिग्री भी घूमती है। जब मैं अपनी उंगली को हटा देता हूं तो यह सामान्य हो जाता है।

ऐसा नहीं होता है अगर मैं UIControlStateHighlighted के लिए एक ही छवि का उपयोग करता हूं, लेकिन फिर मैं स्पर्श संकेत (गहरा चित्र) खो देता हूं।

यह केवल एक फ़ाइल से पढ़ने वाली छवि के साथ होता है। यह [UIImage ImageNamed:] के साथ नहीं होता है।

मैंने फ़ाइल को पीपीजी प्रारूप में जेपीजी के बजाय सहेजने की कोशिश की। इस मामले में छवि गलत अभिविन्यास में शुरू होने के साथ दिखाई देती है, और स्पर्श होने पर फिर से घुमाया नहीं जाता है। यह किसी भी तरह का अच्छा समाधान नहीं है क्योंकि पीएनजी बहुत बड़ा है और इसे संभालने में धीमा है।

क्या यह एक बग है या क्या मैं कुछ गलत कर रहा हूं?

+2

मैं एक ऐसी ही समस्या आ रही है जहां खोलना पृष्ठभूमि सेट करने के बाद एक uiimagepicker से चुने गए एक तस्वीर के लिए छवि, छवि घूर्णन सीसीडब्ल्यू 90 डिग्री दिखाई देता है। – marciokoko

उत्तर

4

मुझे इस पर कोई उचित समाधान नहीं मिला और मुझे त्वरित कार्यवाही की आवश्यकता थी। नीचे एक ऐसा कार्य है, जिसे यूआईएममेज दिया जाता है, एक नई छवि देता है जो अंधेरे अल्फा भरने के साथ अंधेरा होता है। विभिन्न प्रकार के अंधेरे प्रदान करने के लिए संदर्भ भरने के आदेश अन्य ड्रॉ या भरने के दिनचर्या के साथ प्रतिस्थापित किया जा सकता है।

यह गैर-अनुकूलित है और ग्राफिक्स एपीआई के न्यूनतम ज्ञान के साथ बनाया गया था।

आप इस फ़ंक्शन का उपयोग UIControlStateHighlighted राज्य छवि को सेट करने के लिए कर सकते हैं ताकि कम से कम यह गहरा हो।

+ (UIImage *)darkenedImageWithImage:(UIImage *)sourceImage 
{ 
    UIImage * darkenedImage = nil; 

    if (sourceImage) 
    { 
     // drawing prep 
     CGImageRef source = sourceImage.CGImage; 
     CGRect drawRect = CGRectMake(0.f, 
            0.f, 
            sourceImage.size.width, 
            sourceImage.size.height); 
     CGContextRef context = CGBitmapContextCreate(NULL, 
                drawRect.size.width, 
                drawRect.size.height, 
                CGImageGetBitsPerComponent(source), 
                CGImageGetBytesPerRow(source), 
                CGImageGetColorSpace(source), 
                CGImageGetBitmapInfo(source) 
                ); 

     // draw given image and then darken fill it 
     CGContextDrawImage(context, drawRect, source); 
     CGContextSetBlendMode(context, kCGBlendModeOverlay); 
     CGContextSetRGBFillColor(context, 0.f, 0.f, 0.f, 0.5f); 
     CGContextFillRect(context, drawRect); 

     // get context result 
     CGImageRef darkened = CGBitmapContextCreateImage(context); 
     CGContextRelease(context); 

     // convert to UIImage and preserve original orientation 
     darkenedImage = [UIImage imageWithCGImage:darkened 
                 scale:1.f 
               orientation:sourceImage.imageOrientation]; 
     CGImageRelease(darkened); 
    } 

    return darkenedImage; 
} 
2

इसे ठीक करने के आप इस तरह अतिरिक्त सामान्य समारोह की जरूरत है:

public extension UIImage { 

    func normalizedImage() -> UIImage! { 

     if self.imageOrientation == .Up { 
      return self 
     } 

     UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale) 
     self.drawInRect(CGRectMake(0, 0, self.size.width, self.size.height)) 
     let normalized = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return normalized 
    } 
} 

तो आप ऐसा कर सकते हैं:

self.photoButton.sd_setImageWithURL(avatarURL, 
forState: .Normal, 
placeholderImage: UIImage(named: "user_avatar_placeholder")) { 

    [weak self] (image, error, cacheType, url) in 

    guard let strongSelf = self else { 

     return 
    } 

    strongSelf.photoButton.setImage(image.normalizedImage(), forState: .Normal 
}