2011-08-29 14 views
11

[UIImage imageWithContentsOfFile:]によって作成された画像(または背景画像 - 同じ問題)がカメラによって撮影されたJPGファイルを指し、アプリケーションによって文書フォルダに保存されている[UIButton buttonWithType:UIButtonTypeCustom]があります。UIButton画像回転の問題

私がUIControlStateNormalの画像のみを定義すると、ボタンをタッチすると、画像が期待どおりに暗くなりますが、90度または180度のいずれかで回転します。指を離すと元の状態に戻ります。

同じ画像をUIControlStateHighlightedに使用しても、タッチ表示(暗い画像)が失われる場合は、このようなことは起こりません。

これは、ファイルから読み取られたイメージでのみ発生します。 [UIImage ImageNamed:]では発生しません。

ファイルをJPGではなくPNG形式で保存しようとしました。この場合、画像は最初は間違った向きで表示され、タッチすると再び回転しません。なぜなら、PNGは大きすぎて処理が遅いからです。

これはバグですか、何か間違っていますか?

+2

を、私は同様の問題がunbutton背景を設定した後はどこ持ってイメージをuiimagepickerから選択したピクチャに追加すると、イメージは90度回転したように見えます。 – marciokoko

答えて

4

私はこれに適切な解決策を見つけることができませんでした。私はすぐに回避策が必要でした。以下は、UIImageを指定すると暗いアルファ塗りつぶしで暗くなった新しい画像を返す関数です。コンテキストフィルコマンドは、異なるタイプのダークニングを提供するために、他の描画ルーチンまたは塗りつぶしルーチンに置き換えることができる。

これは最適化されておらず、グラフィックス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

あなたは、このような追加の正規化関数が必要になります。

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 
}