2011-10-27 6 views
1

私は多少珍しい問題があります。私のアプリでは、基本的なQuartz2dレイヤのシャドウイングを使用してUIImageViewをシャドーイングしています。私のコードは次のとおりです:アルファベットを保持している間に陰影付きビューからUIImageを作成しますか?

imageView.layer.shadowOpacity = 1.0; // Pretty self explanatory 
imageView.layer.shadowRadius = 8.0; // My softness 
imageView.layer.shadowColor = [UIColor blackColor].CGColor; // Color of the shadow 
imageView.layer.shadowOffset = CGSizeMake(0.0, 0.0); // Offset of the shadow 

これは、画像ビューの後ろに素晴らしいぼかしを生成します。しかし、私はこのビューでいくつかのアニメーションをやっていますが、遷移中にシャドーイングを再計算すると、非常に不安定な遷移が発生します。私ができるようにしたいのは、画像ビューからUIImageまたは.pngファイルを作成し、ぼかしとそのアルファベットをそのまま使用することです。ここで私はすでに試したものです:

UIGraphicsBeginImageContext(CGSizeMake(320, 396)); 
[imageView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 

私はイメージビューの「外成長」の影を持っているので、私はちょうどUIGraphicsBeginImageContext機能で自分のサイズを渡すことはできません。私は正しいサイズを設定しますが、結果の画像は私のアルファを保存しません。代わりに影の背後に白い背景を置きます。私の本当の背景は木のテクスチャなので、私にとってはうまくいかないでしょう。また、ビューは結果ファイルの中央に配置されません。

私はUIKitとかなり良いですが、私はQuartz 2dグラフィックスの本当のnoobieです。もしこれに明らかな答えがあったら、とにかくそれを送ってください。 :)

答えて

1

UIImageViewbackgroundColor[UIColor clearColor]に設定してください。これにより、現在のソリューションが動作する可能性があります。

imageView.backgroundColor = [UIColor clearColor]; 
UIGraphicsBeginImageContext(CGSizeMake(320, 396)); 
[imageView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

出典:Converting a CGLayer to a *transparent* UIImage and PNG file in CoreGraphics iphone

+0

うわー、本当に私を助けたい!私は新しいソリューションを試してみましょう。 – aopsfan

+0

それは働いた!良くやった。 – aopsfan

1

私も以前にこの問題を抱えていました。私の解決策はイメージを作成するのではなく、アニメーション化しているビューのアウトラインにシャドウパスを設定することでした。画像を想定し、以下の機能を使用しています

[imageView setContentMode:UIViewContentModeScaleAspectFit]; 
imageView.layer.masksToBounds = NO; 
imageView.layer.shadowOffset = CGSizeMake(5, 5); 
imageView.layer.shadowRadius = 200; 
imageView.layer.shadowOpacity = 0.5; 
CGRect rect = [self rectFromImageView:imageView]; 
imageView.layer.shadowPath = [UIBezierPath bezierPathWithRect:rect].CGPath; 

コンテンツモードアスペクトフィットに設定されています:

-(CGRect)rectFromImageView:(UIImageView *)iv { 
    CGRect rect = (CGRect){{0,0},iv.frame.size}; 
    if (iv.image.size.width/iv.frame.size.width > iv.image.size.height/iv.frame.size.height) { 
     //rect.origin.x == 0 
     CGFloat sf = iv.frame.size.width/iv.image.size.width; 
     rect.size.height = sf*iv.image.size.height; 
     rect.origin.y = floor((iv.frame.size.height - rect.size.height)/2); 
    } else { 
     //rect.origin.y == 0; 
     CGFloat sf = iv.frame.size.height/iv.image.size.height; 
     rect.size.width = sf*iv.image.size.width; 
     rect.origin.x = floor((iv.frame.size.width - rect.size.width)/2);  
    } 
    return rect; 
} 

あなたのイメージは、ちょうどそのちょうど十分なものでなければならないimageView.boundsを使用して埋めるために設定されている場合

+0

のように表示する影のパスを追加します。 ' - 申し訳ありません。おそらく私の解決策はまだ機能するかもしれませんか? – Benjie

+0

私はあなたの解決策を試しましたが、うまくいきませんでした。私が言ったように、私はこのもので本当のノブです。フレーム内の影を考慮して画像ビューのフレームを拡張し、コンテンツモードを中央に変更して、画像をビューの中央に配置しました。 shadowOpacity = 0を試してみましょう。アニメーション中に見えない場合は、私はそれを使用します。 – aopsfan

+0

は影を取り除こうとしましたが、うまくいかず、まだ遅かった...私は間違ったことをしているに違いないと確信しています。 – aopsfan

1

imageView.layer.shadowOpacity = 0.0 `設定することで、アニメーションの間に、さらに、私はちょうど無効に影を覚えて、実際にこの

[view.layer setShadowPath:[[UIBezierPath bezierPathWithRect:view.bounds] CGPath]]; //add path 
view.layer.shadowColor = [[UIColor blackColor] CGColor]; 
view.layer.shadowOffset = CGSizeMake(x, y); 
view.layer.shadowRadius = rad; 
view.layer.shadowOpacity = 0.2f; 
関連する問題