2016-07-11 2 views
0

UI 요소에 CIFilter를 적용하고 싶습니다. .filters 멤버를 통해 뷰 레이어에 적용하려고했습니다. 그러나 필터가 적용되지 않습니다.UI 요소에 CIFilter 적용

답변

1

UIGraphicsGetImageFromCurrentImageContext을 사용하여 UIImage을 생성하고 필터를 적용한 다음 원래 이미지 위에 필터링 된 이미지가 포함 된 이미지보기를 오버레이합니다. 아주 간단

UIView의 흐리게 표현을 얻고있다 : 여기

는 흐림 ( taken from my blog)과는 그 수있는 방법 내가, 이미지 컨텍스트를 시작으로 렌더링 할 뷰의 레이어의 renderInContext 방법을 사용할 필요가

guard let blur = CIFilter(name: "CIGaussianBlur") else 
{ 
    return 
} 

blur.setValue(CIImage(image: image), forKey: kCIInputImageKey) 
blur.setValue(blurRadius, forKey: kCIInputRadiusKey) 

let ciContext = CIContext(options: nil) 

let result = blur.valueForKey(kCIOutputImageKey) as! CIImage! 

let boundingRect = CGRect(x: -blurRadius * 4, 
    y: -blurRadius * 4, 
    width: frame.width + (blurRadius * 8), 
    height: frame.height + (blurRadius * 8)) 

let cgImage = ciContext.createCGImage(result, fromRect: boundingRect) 


let filteredImage = UIImage(CGImage: cgImage) 
:

UIGraphicsBeginImageContextWithOptions(CGSize(width: frame.width, height: frame.height), false, 1) 

layer.renderInContext(UIGraphicsGetCurrentContext()!) 

let image = UIGraphicsGetImageFromCurrentImageContext() 


UIGraphicsEndImageContext(); 

나는 이미지가 채워했다면, 그것으로 가우시안 블러를 적용 할 수있는 매우 표준 워크 플로우의 : 컨텍스트는 다음 컨텍스트에서있는 UIImage를 얻을 수

흐린 이미지는 입력 이미지보다 커질 것이므로 createCGImage에서 필요한 크기에 대해 명시해야합니다.

다음 단계는 UIImageView을 내보기에 추가하고 다른 모든보기를 숨기는 것입니다. 그것을 제거에 올 때, 나는 제거 아니에요 확신 할 수 있도록 내가 BlurOverlayUIImageView를 서브 클래 싱 한 UIImageView 기존 :

let blurOverlay = BlurOverlay() 
blurOverlay.frame = boundingRect 

blurOverlay.image = filteredImage 

subviews.forEach{ $0.hidden = true } 


addSubview(blurOverlay) 

이-흔들림이 끊긴 부하에 올 때, 나는 마지막을 보장 할

,691 : 그냥 마지막 서브 뷰가 BlurOverlay 있는지 확인해야합니다, 마지막으로

func unBlur() 
{ 
    if let blurOverlay = subviews.last as? BlurOverlay 
    { 
     blurOverlay.removeFromSuperview() 

     subviews.forEach{ $0.hidden = false } 
    } 

} 

하는 UIView 있는지 확인하기 위해 현재 흐리게한다 : 서브 뷰 내 BlurOverlay를 제거하고 숨기기를 취소 기존의보기 중 하나입니다

var isBlurred: Bool 
{ 
    return subviews.last is BlurOverlay 
} 
+0

당신의 답을 기다려주십시오. 그것이 내가하고 싶은 일입니다. MKMapView에서 필터 (원근감 변환)를 적용해야합니다. 그 때 무엇을 권하겠습니까? 사용자 상호 작용이있을 필요는 없습니다. MapView를 뷰에 추가하지 말고 단순히 말한대로 이미지를 얻는 것입니다. 그러나 MapView를 프로그래밍 방식으로 회전하여 움직이는 동안 특정 프레임 속도를 가져야합니다. 보기를 이동하면서 더 많은 이미지를 얻으려면 어떻게해야합니까? – Lenny1357

+0

이미지를 3D로 회전하려면 이미지를 평면에 적용한 SceneKit 머티리얼의 확산 내용으로 사용하지 않는 이유는 무엇입니까? 원근감 변환의 포인트를 애니메이트하려면'CADisplayLink'를보십시오 (하지만 SceneKit으로 더 재미있는 결과를 얻을 것입니다 :)). –

+0

MapView를 지리적 좌표로 회전 시키십시오. 좌표 주위의 회전은 적용된 필터로 표시되어야합니다. 간단한 이미지는이 경우에 트릭을하지 않을 것입니다. 적용된 CIFilter를 사용하여 MapView가 자체적으로 관리하는 순환 게재를 표시하려면 무엇을 제안 하시겠습니까? 비디오에 CIFilter를 적용하는 것과 같지만 제 경우에는 보여주고 자하는 MapView 자체의 애니메이션입니다. 나는 sth이 필요할 것이다. PixelBuffer와 같습니다. 불행히도 MapView를 설정할 수 없다고 생각합니다. – Lenny1357