2010-12-30 9 views
28

비슷한 질문을 보았지만 실행 가능한 답변을 찾지 못했습니다.iOS에서 UIView를 마스크하는 방법

회색 이미지 (마스크 용 알파 스케일로 변환해야 함)를 사용하여 UIView를 마스크하려고합니다. UIView 배경이 있습니다. 이미지를 마스킹하기 쉬워야하지만 모든 UIView를 가리고 싶습니다.

실마리가 있습니다.

답변

67

저는이 문제에 대해 2 시간 동안 노력해 왔으며 원하는대로 할 수 있다고 생각합니다. 먼저, 귀하가 적합하다고 생각하는 것을 사용하여 마스킹 이미지를 만듭니다. 여기서 알파 값 만 필요하므로 다른 모든 색상은 무시되므로 사용하는 메서드가 알파 값을 지원하는지 확인하십시오. 이 예제에서는 .png 파일에서로드하지만 알파 값이 없으므로 .jpg 파일로 시도하지 마십시오.

다음, 새 레이어를 만들고 그 내용에 마스크를 할당과 같이, 당신의 UIView 자신의 레이어에 새로운 레이어를 설정 : 당신이 찾아야하는이 마스크의 UIView와 연결된 모든 서브 뷰 :

UIImage *_maskingImage = [UIImage imageNamed:@"mask"]; 
CALayer *_maskingLayer = [CALayer layer]; 
_maskingLayer.frame = theView.bounds; 
[_maskingLayer setContents:(id)[_maskingImage CGImage]]; 
[theView.layer setMask:_maskingLayer]; 

이렇게하면 UIView의 배경색을 원하는대로 설정할 수 있고 마스크를 사용하여 컬러 필터를 만들 수 있습니다.

편집 : 이제 iOS8에서 maskView 속성에 다른보기를 할당하여보기를 마스킹 할 수 있습니다. maskView의 알파 레이어가 적용된 뷰의 불투명도를 결정하는 데 사용된다는 점에서 일반적인 규칙은 그대로 유지됩니다.

+0

답변 해 주셔서 감사합니다. 문제는 그레이 스케일 (모든 점에 대해 알파 == 1) 이미지 만 있습니다. 그레이 스케일 이미지를 알파 이미지로 변환하고 싶습니다. 너는 어떤 생각을 가지고 있니? – subchap

+2

글쎄, 최선의 방법은 Photoshop과 같은 이미지 편집 도구로 가져 와서 변환하는 것입니다. 대안은 새 이미지 컨텍스트를 만든 다음 회색 구성 요소를 읽는 이전 이미지에서 픽셀별로 진행하고이를 새 이미지에 플로팅하기 전에 새 색상의 알파 구성 요소로 변환하여 프로그래밍 방식으로 수행하는 것입니다 .페인트 패키지로 처리하는 데 드는 시간을 줄이면 시간 낭비와 번거 로움이 있습니다. – Ash

+1

포토샵에서는 쉽게 할 수 있습니다. (1) 새 레이어 만들기 (2) 검정색 부분으로 채우기 (3) 레이어 마스크를 지정하고 (4) 그레이 스케일 이미지를 마스크로 지나치십시오. 검정 = 투명, 흰색 = 불투명, 회색은 투명도가 다양합니다. (5) 레이어 마스크를 적용합니다. (레이어 패널에서 마스크 자체를 마우스 오른쪽 버튼으로 클릭하고 '레이어 마스크 적용'을 클릭합니다.) (6) 필요한 레이어 부분을 잘라냅니다. –

1

내 머리 꼭대기에서 정확한 코드를 모르지만 기본 아이디어는 두 개의 UIView를 갖는 것입니다. 하나의 UIView는 그레이 스케일 이미지로 설정된 이미지 속성을 가지며 다른 UIView는 보통대로 설정됩니다. 유일한 차이점은 "정상"이미지가 포함 된 UIView 위에 직접 초기 UIView를 배치한다는 것입니다.

아이디어를 한 걸음 더 전하기에 충분할 것으로 기대합니다.

+0

감사를보기가 @IBOutlet으로 정의된다

func scrollViewWillBeginDragging(scrollView: UIScrollView) { exerDetailsTableView.maskView = nil } 

. 분명히하지는 않았지만, 원하는 것은 그레이 스케일 이미지를 알파 이미지로 변환하고 (보통의 마스킹처럼) UIView에 적용하는 것입니다. – subchap

6

iOS 8.0 이상을 타겟팅하는 앱의 경우 효과가있었습니다 (이 경우 그라디언트를 마스크로 사용함). 마스크 크기를 조정하거나 위치를 지정할 필요가 없습니다.

// Add gradient mask to view 
func AddGradientMask(targetView: UIView) 
{ 
    let gradientMask = CAGradientLayer() 

    gradientMask.frame = targetView.bounds 
    gradientMask.colors = [UIColor.blackColor().CGColor, UIColor.clearColor().CGColor] 
    gradientMask.locations = [0.8, 1.0] 

    let maskView: UIView = UIView() 
    maskView.layer.addSublayer(gradientMask) 

    targetView.maskView = maskView 
} 

내 경우에는 사용자가 스크롤을 시작하면 마스크를 제거하고 싶습니다. 이 작업은 이루어집니다 :

@IBOutlet weak var exerDetailsTableView: UITableView! 

결과 : 귀하의 답변에 대한

example screenshot

관련 문제