2016-10-26 5 views
0
나는 다음과 같은 예에서와 같이 하나가 서로 inbetween 약간의 공간이 서로를 잘라 다음과 같은 방법으로, 두 UIImageView의를 준비 할 필요가

:공간 하나를 잘라 다른

space circles

I 녹색 원 주위에 투명도가 필요하기 때문에 borderWidth을 사용할 수 없습니다. 내 앱에는 배경 이미지보기가 있으므로 borderWidth 사용자는 이미지 주위에 검정색 테두리 선이 표시되거나 clearColor을 사용하면 아무 것도 볼 수 없습니다. 어떤 제안?

답변

2

레이어 마스크를 사용하여이 작업을 수행 할 수 있습니다.

스위프트 2.3

let mask = CAShapeLayer() 
let path = CGPathCreateMutable() 

let center = view.convertPoint(statusImageView.center, toView: profileImageView) 
let radius = statusImageView.frame.width/2 + 4 

CGPathAddRect(path, nil, profileImageView.bounds) 
CGPathAddArc(path, nil, center.x, center.y, radius, 0, CGFloat(2 * M_PI), false) 

mask.fillRule = kCAFillRuleEvenOdd 
mask.path = path 

profileImageView.layer.mask = mask 
profileImageView.clipsToBounds = true 

스위프트 3

let mask = CAShapeLayer() 
let path = CGMutablePath() 

path.addRect(profileImageView.bounds) 
path.addArc(
    center: view.convert(statusImageView.center, to: profileImageView), 
    radius: statusImageView.frame.width/2 + 4, 
    startAngle: 0, 
    endAngle: CGFloat(2 * M_PI), 
    clockwise: false 
) 

mask.fillRule = kCAFillRuleEvenOdd 
mask.path = path 

profileImageView.layer.mask = mask 
profileImageView.clipsToBounds = true 

UPDATE

class MatchViewController: UIViewController { 

    // MARK: Outlets 

    @IBOutlet var matchedImageView: UIImageView! 
    @IBOutlet var profileImageView: UIImageView! 
    @IBOutlet var tickImageView: UIImageView! 

    // MARK: Properties 

    var innerContainer: UIView! { return profileImageView.superview } 
    var outerContainer: UIView! { return innerContainer?.superview } 

    // MARK: Lifecycle 

    override func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent } 

    override func viewDidAppear(animated: Bool) { 

     super.viewDidAppear(animated) 

     let mask = CAShapeLayer(), 
      path = CGPathCreateMutable() 

     let center = outerContainer.convertPoint(tickImageView.center, toView: innerContainer), 
      radius = tickImageView.frame.width/2 + 4 

     CGPathAddRect(path, nil, innerContainer.bounds) 
     CGPathAddArc(path, nil, center.x, center.y, radius, 0, CGFloat(2 * M_PI), false) 

     mask.fillRule = kCAFillRuleEvenOdd 
     mask.path = path 

     innerContainer?.layer.mask = mask 
     innerContainer?.clipsToBounds = true 
    } 
} 

조회수가 이렇게 구성되어 있는지 확인하십시오.

Storyboard

는 결과가 될 것이다. 해야합니다.

Simulator

+0

고맙습니다! 나는'CGMutablePath'에 접근 가능한 이니셜 라이저가 없기 때문에 생성 할 수 없다는 에러를 얻었습니다. xcode 8 및 swift 2.3을 사용합니다. – Ilya

+0

오, 신속한 사용을 가정했습니다. – Callam

+0

2.3 및 3 모두 내 대답을 업데이트했습니다. – Callam

1

이미지에 클리핑을 사용하고 UIImageView 대신 사용자 정의보기를 사용할 수 있습니다. 클리핑 경로를 계산하려면 intersection of two circles이 필요합니다.

관련 문제