2011-08-29 56 views
11

我有一個[UIButton buttonWithType:UIButtonTypeCustom]具有圖像(或背景圖片 - 同樣的問題)由[UIImage imageWithContentsOfFile:]指向創建相機應用程序拍攝並保存在文檔文件夾中的JPG文件。UIButton的圖像旋轉問題

如果我只爲UIControlStateNormal定義圖像,那麼當我觸摸按鈕時,圖像會像預期的那樣變暗,但它也會旋轉90度或180度。當我移開手指時,它恢復正常。

如果我使用相同的圖像UIControlStateHighlighted這不會發生,但後來我失去了觸摸指示(較暗的圖像)。

這隻發生在從文件讀取的圖像上。它不會發生在[UIImage ImageNamed:]

我試圖保存爲PNG格式,而不是爲JPG文件。在這種情況下,圖像以錯誤的方向顯示,並在觸摸時不再旋轉。無論如何,這不是一個好的解決方案,因爲PNG太大而且處理速度太慢。

這是一個錯誤還是我做錯了什麼?

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

那麼你可以使用它像圖像到從uiimagepicker選擇的圖片,圖像顯示旋轉90度。 – marciokoko

回答

4

我沒能找到這一個妥善的解決辦法,我需要一個快速的解決方法。下面是一個函數,它給出一個UIImage,返回一個黑暗的alpha填充變暗的新圖像。上下文填充命令可以替換爲其他繪製或填充例程以提供不同類型的變暗。

這是未優化,並用圖形API的最小的知識做出。

您可以使用此功能來設置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

要解決這個問題,你需要額外的標準化功能是這樣的:在那裏設置解開背景後

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 
}