2011-10-27 2 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으로 꽤 좋지만, 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; 
관련 문제