다른 UIView에서 UIView와 상호 작용 허용


115

다른 UIView 아래에있는 UIView의 버튼과 상호 작용을 허용하는 간단한 방법이 있습니까? 버튼 위에있는 상단 UIView의 실제 개체가없는 경우

예를 들어, 현재 화면 상단에는 개체가 있고 화면 하단에는 개체가 있고 중간에는 아무것도없는 UIView (A)가 있습니다. 이것은 가운데 (B)에 버튼이있는 다른 UIView 위에 있습니다. 그러나 B 중간에있는 버튼과 상호 작용할 수없는 것 같습니다.

B의 버튼을 볼 수 있습니다. A의 배경을 clearColor로 설정했지만 B의 버튼은 실제로 해당 버튼 위에 A의 개체가 없다는 사실에도 불구하고 터치를받지 않는 것 같습니다.

편집 -나는 여전히 상단 UIView의 객체와 상호 작용할 수 있기를 원합니다.

확실히 이것을하는 간단한 방법이 있습니까?


2
거의 모두 여기에 설명되어 있습니다. developer.apple.com/iphone/library/documentation/iPhone/… 하지만 기본적으로 hitTest : withEvent :를 재정의하면 코드 샘플도 제공됩니다.
nash

나는 그것을 위해 작은 수업을 작성했습니다. (답변에 예를 추가했습니다). 의 비 투명 부분 이 여전히 터치 이벤트에 응답하는 동안 UIButton반투명 아래에있는 a 를 클릭 할 수 있기 때문에 수락 된 답변보다 약간 더 나은 솔루션 입니다. UIViewUIView
Segev 2015

답변:


97

상위 뷰에 대한 UIView 하위 클래스를 만들고 다음 메서드를 재정의해야합니다.

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    // UIView will be "transparent" for touch events if we return NO
    return (point.y < MIDDLE_Y1 || point.y > MIDDLE_Y2);
}

hitTest : event : 메소드를 볼 수도 있습니다.


19
여기서 middle_y1 / y2는 무엇입니까?
Jason Renaldo 2014 년

return진술이 무엇을하는지 확실하지 않지만 return CGRectContainsPoint(eachSubview.frame, point)나를 위해 작동합니다. 그렇지 않으면 매우 유용한 답변
n00neimp0rtant

MIDDLE_Y1 / Y2 비즈니스는 단지 예일뿐입니다. 이 기능은 해당 MIDDLE_Y1<=y<=MIDDLE_Y2영역의 터치 이벤트에 대해 "투명" 합니다.
gyim

41

여기에있는 많은 답변이 작동하지만, 가장 편리하고 일반적이며 완벽한 답변이 여기에 제공되지 않았다는 사실에 조금 놀랐습니다. @Ash가 가장 가까이 왔는데, 슈퍼 뷰를 반환하는 데 이상한 일이 벌어지고 있다는 점을 제외하면 ... 그렇게하지 마세요.

이 답변은 유사한 질문에 대한 답변에서 가져온 입니다.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *hitView = [super hitTest:point withEvent:event];
    if (hitView == self) return nil;
    return hitView;
}

[super hitTest:point withEvent:event]터치 된 뷰의 계층 구조에서 가장 깊은 뷰를 반환합니다. If hitView == self(즉, 터치 포인트 아래에 하위 뷰가없는 경우)를 반환 nil하여이 뷰가 터치를 수신 하지 않도록 지정합니다 . 응답자 체인이 작동하는 방식은 터치에 응답 할보기를 찾을 때까지이 지점 위의보기 계층 구조가 계속 순회된다는 것을 의미합니다. 수퍼 뷰가 터치를 허용해야하는지 여부는이 뷰에 달려 있지 않으므로 수퍼 뷰를 반환 하지 마십시오 !

이 솔루션은 다음과 같습니다.

  • 다른 뷰 / 하위 뷰 / 객체에 대한 참조가 필요하지 않기 때문에 편리 합니다.
  • generic , 이는 순전히 터치 가능한 하위보기에 대한 컨테이너 역할을하는 모든보기에 적용되고 하위보기의 구성은 작동 방식에 영향을주지 않기 때문입니다 ( pointInside:withEvent:특정 터치 가능 영역을 반환하도록 재정의 하는 경우처럼 ).
  • 완벽 하고 코드가 많지 않으며 개념은 머리를 돌리는 것이 어렵지 않습니다.

한 번의 재정의에 대해 무의미한 뷰 하위 클래스를 저장하기 위해 하위 클래스로 추상화 할만큼 자주 사용합니다. 보너스로 속성을 추가하여 구성 할 수 있습니다.

@interface ISView : UIView
@property(nonatomic, assign) BOOL onlyRespondToTouchesInSubviews;
@end

@implementation ISView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *hitView = [super hitTest:point withEvent:event];
    if (hitView == self && onlyRespondToTouchesInSubviews) return nil;
    return hitView;
}
@end

그런 다음 평범한 UIView. 구성은로 설정 onlyRespondToTouchesInSubviews하는 것만 큼 ​​간단 합니다 YES.


2
유일한 정답입니다. 명확하게 말하면 뷰에 대한 터치무시하고 뷰에 포함 된 버튼 (예 :)에 대한 터치무시하려면 Stuart가 설명하는대로 수행하십시오. (저는 일부 버튼을 무해하게 "홀드"할 수 있기 때문에 일반적으로 "홀더 뷰"라고 부르지 만 홀더 "아래"에는 영향을주지 않습니다.)
Fattie

포인트를 사용하는 다른 솔루션 중 일부는 UITableView 및 UICollectionView와 같이 뷰를 스크롤 할 수 있고 위 또는 아래로 스크롤 한 경우 문제가 있습니다. 그러나이 솔루션은 스크롤링에 관계없이 작동합니다.
pajevic

31

이를 처리 할 수있는 방법에는 여러 가지가 있습니다. 필자가 가장 좋아하는 것은 충돌하는 뷰 (A와 B라고 부르는 것처럼 들림)에 대한 일반적인 수퍼 뷰 (간접적 일 수 있음) 인 뷰에서 hitTest : withEvent :를 재정의하는 것입니다. 예를 들어 다음과 같습니다 (여기서 A와 B는 UIView 포인터이며 B는 일반적으로 무시되는 "숨겨진"포인터입니다).

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    CGPoint pointInB = [B convertPoint:point fromView:self];

    if ([B pointInside:pointInB withEvent:event])
        return B;

    return [super hitTest:point withEvent:event];
}

pointInside:withEvent:김이 제안한 방법을 수정할 수도 있습니다 . 이렇게하면 최소한 터치에 대해 A에서 효과적으로 "구멍을 뚫음"으로써 본질적으로 동일한 결과를 얻을 수 있습니다.

또 다른 접근 방식은 이벤트 전달이며, 이는 처음 이동하는 위치와 다른 개체에 터치를 보내기 위해 재정의 touchesBegan:withEvent:및 유사한 메서드 (예 : touchesMoved:withEvent:etc)를 의미 합니다. 예를 들어 A에서 다음과 같이 작성할 수 있습니다.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if ([self shouldForwardTouches:touches]) {
        [B touchesBegan:touches withEvent:event];
    }
    else {
        // Do whatever A does with touches.
    }
}

그러나 이것이 항상 예상대로 작동 하는 것은 아닙니다 ! 가장 중요한 것은 UIButton과 같은 기본 제공 컨트롤이 항상 전달 된 터치를 무시한다는 것입니다. 이 때문에 첫 번째 접근 방식이 더 안정적입니다.

이 모든 것을 더 자세히 설명하는 좋은 블로그 게시물과 아이디어를 시연하는 작은 xcode 프로젝트가 여기에 있습니다.

http://bynomial.com/blog/?p=74


이 솔루션의 문제 (일반 수퍼 뷰에서 hitTest를 재정의)는 아래 뷰가 전체 스크롤 가능한 뷰 세트 (MapView 등) 중 하나 일 때 아래 뷰가 완전히 올바르게 작동하도록 허용하지 않는다는 것입니다. 아래 gyim이 제안한 것처럼 상위 뷰의 재정의는 내가 알 수있는 한 모든 경우에 작동합니다.
delany

@delany, 사실이 아닙니다. 스크롤 가능한 뷰를 다른 뷰 아래에두고 hitTest를 재정 의하여 둘 다 작동하도록 할 수 있습니다. 다음은 몇 가지 샘플 코드입니다. bynomial.com/blogfiles/Temp32.zip
Tyler

야. 스크롤 가능한 모든 뷰가 아닙니다. 일부만 ... 위에서 우편 번호를 시도하여 UIScrollView를 (예를 들어) MKMapView로 변경했는데 작동하지 않습니다. 탭이 작동합니다. 스크롤링이 문제인 것 같습니다.
delany 2011 년

좋아, 나는 그것을 확인하고 hitTest가 MKMapView에서 원하는 방식으로 작동하지 않는다는 것을 확인했습니다. 당신이 맞았어요, @delany; UIScrollView에서 올바르게 작동하지만. MKMapView가 실패하는 이유가 궁금합니다.
Tyler

@Tyler 언급했듯이 "가장 중요한 것은 UIButton과 같은 기본 제공 컨트롤이 항상 전달 된 터치를 무시한다는 것입니다."라는 점을 알고 싶습니다.이 동작을 설명하는 공식 문서인지 알고 싶습니다. UIButton에 일반 UIView 하위보기가있을 때 하위보기 경계의 터치 이벤트에 응답하지 않는 문제에 직면했습니다. 그리고 이벤트가 UIView의 기본 동작으로 올바르게 UIButton으로 전달되는 것을 발견했지만 지정된 기능인지 버그인지 확실하지 않습니다. 이에 대한 문서를 보여 주시겠습니까? 진심으로 감사합니다.
Neal.Marlin

29

을 설정해야합니다 upperView.userInteractionEnabled = NO;. 그렇지 않으면 상단보기가 터치를 차단합니다.

이것의 Interface Builder 버전은 "User Interaction Enabled"라는 View Attributes 패널의 맨 아래에있는 확인란입니다. 체크를 해제하면 가셔도 좋습니다.


죄송합니다. 나는 여전히 상단 UIView의 개체와 상호 작용할 수 있기를 원합니다.
delany 2009

그러나 upperView는 어떠한 터치도받을 수 없으며, upperView에 버튼을 포함합니다.
imcaptor 2010

2
이 솔루션은 저에게 효과적입니다. 터치에 반응하는 상단 뷰가 전혀 필요하지 않았습니다.
TJ

11

pointInside : withEvent :의 사용자 정의 구현은 실제로 갈 길처럼 보였지만 하드 코딩 된 좌표를 다루는 것은 나에게 이상하게 보였습니다. 그래서 CGPoint가 CGRectContainsPoint () 함수를 사용하여 CGRect 버튼 안에 있는지 확인했습니다.

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    return (CGRectContainsPoint(disclosureButton.frame, point));
}

8

최근에 저에게 도움이 될 수업을 썼습니다. UIButton또는에 대한 사용자 정의 클래스로 사용하면 UIView투명 픽셀에서 실행 된 터치 이벤트를 전달합니다.

이 솔루션은 UIButton반투명 아래에있는 a 를 클릭 할 수 있지만의 투명 UIView하지 않은 부분 UIView은 여전히 ​​터치 이벤트에 응답 할 수 있기 때문에 허용 된 답변보다 다소 낫습니다 .

GIF

GIF에서 볼 수 있듯이 Giraffe 버튼은 단순한 직사각형이지만 투명한 영역의 터치 이벤트는 UIButton아래 의 노란색으로 전달됩니다 .

수업 링크


2
코드가 그다지 길지 않기 때문에 향후 프로젝트가 이동되거나 제거 될 경우를 대비하여 관련 부분을 답변에 포함해야합니다.
Gavin

감사합니다. 귀하의 솔루션은 터치 이벤트에 응답하기 위해 UIView의 투명하지 않은 부분이 필요한 경우에 작동하지만 투명 부분은 그렇지 않습니다. 훌륭한!
Bruce

@Bruce 감사합니다!
Segev 2015

4

이 파티에 조금 늦었지만 가능한 해결책을 추가하겠습니다.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *hitView = [super hitTest:point withEvent:event];
    if (hitView != self) return hitView;
    return [self superview];
}

이 코드를 사용하여 사용자 지정 UIView의 표준 hitTest 함수를 재정의하면보기 자체 만 무시됩니다. 해당 뷰의 모든 하위 뷰는 정상적으로 히트를 반환하고 뷰 자체로 이동했을 모든 히트는 수퍼 뷰로 전달됩니다.

-금연 건강 증진 협회


1
이것은 내가 선호하는 방법이지만, 당신이 돌아와야한다고 생각하지 않습니다 [self superview]. 이 메서드에 대한 문서는 "지정된 포인트를 포함하는 뷰 계층 구조 (자체 포함)에서 수신자의 가장 먼 하위 항목을 반환합니다"및 "포인트가 수신자의 뷰 계층 구조를 완전히 벗어난 경우 nil을 반환합니다"상태입니다. 돌아와야한다고 생각합니다 nil. nil을 반환하면 제어가 수퍼 뷰로 전달되어 히트가 있는지 여부를 확인합니다. 따라서 기본적으로 동일한 작업을 수행 할 것입니다. 단, superview를 반환하면 나중에 무언가가 깨질 수 있습니다.
jasongregori

물론, 그것은 아마도 현명 할 것입니다 (내 원래 답변의 날짜에 주목하십시오-그 이후로 더 많은 코딩을 수행했습니다)
Ash

4

Accepted Answer에 대한 내용을 참고하고 여기에 참고 용으로 넣으십시오. Accepted Answer는 완벽하게 작동합니다. 다음과 같이 확장하여 뷰의 하위 뷰가 터치를 받거나 뒤에있는 뷰에 전달할 수 있습니다.

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    // If one of our subviews wants it, return YES
    for (UIView *subview in self.subviews) {
        CGPoint pointInSubview = [subview convertPoint:point fromView:self];
        if ([subview pointInside:pointInSubview withEvent:event]) {
            return YES;
        }
    }
    // otherwise return NO, as if userInteractionEnabled were NO
    return NO;
}

참고 :pointInside:withEvent:메서드가 자동으로 처리 하므로 서브 뷰 트리에서 재귀를 수행 할 필요조차 없습니다 .


3

userInteraction 속성을 비활성화하면 도움이 될 수 있습니다. 예 :

UIView * topView = [[TOPView alloc] initWithFrame:[self bounds]];
[self addSubview:topView];
[topView setUserInteractionEnabled:NO];

(참고 : 위 코드에서 'self'는 뷰를 나타냅니다.)

이렇게하면 topView에만 표시 할 수 있지만 사용자 입력은받지 않습니다. 이러한 모든 사용자 터치는이보기를 통해 이루어지며 하단보기가 이에 대해 응답합니다. 이 topView를 사용하여 투명한 이미지를 표시하거나 애니메이션을 적용합니다.


3

이 접근 방식은 매우 깨끗하며 투명한 하위 뷰 가 터치에도 반응하지 않도록합니다. 하위 클래스 UIView를 만들고 다음 메서드를 구현에 추가하십시오.

@implementation PassThroughUIView

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    for (UIView *v in self.subviews) {
        CGPoint localPoint = [v convertPoint:point fromView:self];
        if (v.alpha > 0.01 && ![v isHidden] && v.userInteractionEnabled && [v pointInside:localPoint withEvent:event])
            return YES;
    }
    return NO;
}

@end

2

여기 내 솔루션 :

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    CGPoint pointInView = [self.toolkitController.toolbar convertPoint:point fromView:self];

    if ([self.toolkitController.toolbar pointInside:pointInView withEvent:event]) {
       self.userInteractionEnabled = YES;
    } else {
       self.userInteractionEnabled = NO;
    }

    return [super hitTest:point withEvent:event];
}

도움이 되었기를 바랍니다


2

두보기 모두에서 터치를 가로 챌 수있는 방법이 있습니다.

평면도:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   // Do code in the top view
   [bottomView touchesBegan:touches withEvent:event]; // And pass them on to bottomView
   // You have to implement the code for touchesBegan, touchesEnded, touchesCancelled in top/bottom view.
}

그러나 그것이 아이디어입니다.


이것은 확실히 가능합니다.하지만 많은 작업입니다 (하단 레이어 (예 : 버튼)에서 자신의 터치 감지 개체를 굴려야 할 것입니다. 제 생각에?). 직관적 인 것처럼 보이는 행동을 얻는 방법.
delany

시도 해봐야할지 모르겠습니다.
Alexandre Cassagne

2

다음은 Swift 버전입니다.

override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
    return !CGRectContainsPoint(buttonView.frame, point)
}

2

스위프트 3

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
    for subview in subviews {
        if subview.frame.contains(point) {
            return true
        }
    }
    return false
}

1

UI 툴킷을 사용하여 완전한 사용자 인터페이스를 구축 한 적이 없기 때문에 경험이 많지 않습니다. 그래도 작동해야한다고 생각하는 것이 있습니다.

모든 UIView와이 UIWindow는 subviews모든 서브 뷰를 포함하는 NSArray 속성을 가지고 있습니다.

뷰에 추가 한 첫 번째 하위 뷰는 인덱스 0과 다음 인덱스 1 등을받습니다. 계층에서 하위 뷰의 위치를 ​​결정할 수 addSubview:있는 insertSubview: atIndex:또는 insertSubview:aboveSubview:및 이러한 메서드로 대체 할 수도 있습니다.

따라서 코드를 확인하여 UIWindow에 먼저 추가 한 뷰를 확인하십시오. 그것은 0이 될 것이고 다른
하나는 1이 될 것입니다. 이제, 당신의 서브 뷰 중 하나에서 다른 것에 도달하기 위해 다음을 수행 할 것입니다.

UIView * theOtherView = [[[self superview] subviews] objectAtIndex: 0];
// or using the properties syntax
UIView * theOtherView = [self.superview.subviews objectAtIndex:0];

귀하의 경우에 효과가 있는지 알려주십시오!


(이 마커 아래에 내 이전 답변이 있습니다) :

뷰가 서로 통신해야하는 경우 컨트롤러를 통해 수행해야합니다 (즉, 인기있는 MVC 모델 사용).

새보기를 만들 때 컨트롤러에 자신을 등록 할 수 있습니다.

따라서이 기술은 뷰가 컨트롤러에 등록되도록하는 것입니다 (이름 또는 원하는대로 사전 또는 배열에 저장할 수 있음). 컨트롤러가 메시지를 보내도록하거나 뷰에 대한 참조를 가져 와서 직접 통신 할 수 있습니다.

뷰에 컨트롤러로 돌아가는 링크가없는 경우 (경우에 해당 할 수 있음) 싱글 톤 및 / 또는 클래스 메서드를 사용하여 컨트롤러에 대한 참조를 얻을 수 있습니다.


답장을 보내 주셔서 감사합니다. 이해가 잘 안됩니다. 두보기 모두 컨트롤러가 있습니다. 문제는 하나의보기가 다른보기 위에있는 경우 실제로 해당 이벤트를 '차단'하는 개체가없는 경우에도 하단보기가 이벤트를 선택하지 않고 해당 컨트롤러로 전달하지 않는다는 것입니다. 상위 뷰.
delany 2009

UIViews 상단에 UIWindow가 있습니까? 그렇게하면 이벤트가 전파되어야하며 "마법"을 수행 할 필요가 없습니다. Apple Dev center에서 [Window and Views] [1]에 대해 읽어보십시오 (도움이되지 않으면 코멘트를 추가하십시오!) [1] : developer.apple.com/iphone/library/documentation/ iPhone /…
nash 2011

예, 물론 계층 구조의 맨 위에있는 UIWindow입니다.
delany

뷰 계층 구조를 통과하는 코드를 포함하도록 대답을 업데이트했습니다. 다른 도움이 필요하면 알려주세요!
nash

도와 주셔서 감사합니다. 그러나 저는 이러한 인터페이스를 구축하는 데 상당히 경험이 있으며 현재의 인터페이스는 제가 아는 한 올바르게 설정되어 있습니다. 이 문제는 전체보기가 다른보기 위에 배치 될 때의 기본 동작 인 것 같습니다.
delany

1

올바른 방법은 뷰 계층 구조에 내장 된 뷰 체인을 사용하는 것입니다. 기본보기에 푸시되는 하위보기의 경우 일반 UIView를 사용하지 말고 대신 하위 클래스 UIView (또는 UIImageView와 같은 변형 중 하나)를 사용하여 MYView : UIView (또는 UIImageView와 같은 원하는 수퍼 유형)를 만드십시오. YourView 구현에서 touchesBegan 메서드를 구현합니다. 이 메서드는 해당 뷰를 터치하면 호출됩니다. 해당 구현에 필요한 것은 인스턴스 메서드입니다.

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event ;
{   // cannot handle this event. pass off to super
    [self.superview touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event]; }

이 touchesBegan은 응답자 API이므로 공개 또는 비공개 인터페이스에서 선언 할 필요가 없습니다. 그것은 당신이 알아야 할 마법 API 중 하나입니다. 이 self.superview는 결국 viewController에 요청을 버블 링합니다. 그런 다음 viewController에서이 touchesBegan을 구현하여 터치를 처리합니다.

터치 위치 (CGPoint)는 뷰 계층 구조 체인에서 위로 바운스 될 때 포함하는 뷰를 기준으로 자동으로 조정됩니다.


1

그냥 이것을 게시하고 싶습니다. 저는 다소 비슷한 문제가 있었고 운없이 여기에 답변을 구현하는 데 상당한 시간을 보냈습니다. 내가 한 일 :

 for(UIGestureRecognizer *recognizer in topView.gestureRecognizers)
 {
     recognizer.delegate=self;
     [bottomView addGestureRecognizer:recognizer];   
 }
 topView.abView.userInteractionEnabled=NO; 

및 구현 UIGestureRecognizerDelegate:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

하단 뷰는 여러 개의 segues가있는 내비게이션 컨트롤러 였고 그 위에 팬 제스처로 닫을 수있는 일종의 문이있었습니다. 모든 것이 또 다른 VC에 포함되었습니다. 매력처럼 작동했습니다. 도움이 되었기를 바랍니다.


1

HitTest 기반 솔루션을위한 Swift 4 구현

let hitView = super.hitTest(point, with: event)
if hitView == self { return nil }
return hitView

0

Stuart의 훌륭하고 대체로 절대적인 대답과 Segev의 유용한 구현에서 파생 된 다음은 모든 프로젝트에 드롭 할 수있는 Swift 4 패키지입니다.

extension UIColor {
    static func colorOfPoint(point:CGPoint, in view: UIView) -> UIColor {

        var pixel: [CUnsignedChar] = [0, 0, 0, 0]

        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)

        let context = CGContext(data: &pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)

        context!.translateBy(x: -point.x, y: -point.y)

        view.layer.render(in: context!)

        let red: CGFloat   = CGFloat(pixel[0]) / 255.0
        let green: CGFloat = CGFloat(pixel[1]) / 255.0
        let blue: CGFloat  = CGFloat(pixel[2]) / 255.0
        let alpha: CGFloat = CGFloat(pixel[3]) / 255.0

        let color = UIColor(red:red, green: green, blue:blue, alpha:alpha)

        return color
    }
}

그리고 hitTest로 :

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    guard UIColor.colorOfPoint(point: point, in: self).cgColor.alpha > 0 else { return nil }
    return super.hitTest(point, with: event)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.