0

내 iOS 앱의 맨 앞면에 (배경) 마스크보기를 추가하려고합니다. 해당 마스크보기에서 마스크보기를 닫을 UITapGestureRecognizer를 추가하고 싶습니다. 궁극적으로 중간에 팝업을 표시하고 싶습니다 (예 : 내 마스크보기가 팝업의 희미한 배경 임).하지만 지금은 예상대로 내 배경을 해제하는 데 문제가 있습니다.TapGestureRecognizer가 터치를받지 않는 전면 UIView

코드는 다음과 같습니다. 나는 가장 앞쪽에있는 창을 얻습니다. 배경 화면을 만들고 알파를 추가합니다. 그런 다음 제스처 인식기를 추가하고 창에 추가하고 제약 조건을 추가합니다.

그러나 제 탭 제스처 대상 didTapOnMaskView()이 실행되지 않습니다.

private func createMaskView() { 

    let applicationKeyWindow = UIApplication.shared.windows.last 
    backgroundView = UIView() 
    backgroundView.translatesAutoresizingMaskIntoConstraints = false 
    backgroundView.backgroundColor = UIColor(white: 0, alpha: 0.2) 

    backgroundDismissGesture = UITapGestureRecognizer(target: self, action: #selector(didTapOnMaskView)) 
    backgroundDismissGesture.numberOfTapsRequired = 1 
    backgroundDismissGesture.cancelsTouchesInView = false; 
    backgroundView.addGestureRecognizer(backgroundDismissGesture) 
    backgroundView.isUserInteractionEnabled = true 

    backgroundView.alpha = 0.0 

    UIView.animate(withDuration: 0.4) { 
     self.backgroundView.alpha = 1.0 
    } 

    applicationKeyWindow.addSubview(backgroundView) 

    let views: [String: UIView] = [ "backgroundView": backgroundView] 

    var allConstraints = [NSLayoutConstraint]() 

    let verticalConstraint = NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[backgroundView]-0-|", options: [], metrics: nil, views: views) 
    allConstraints += verticalConstraint 

    let horizontalConstraint = NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[backgroundView]-0-|", options: [], metrics: nil, views: views) 
    allConstraints += horizontalConstraint 

    NSLayoutConstraint.activate(allConstraints) 

    // This is super odd, but the gesture gets triggered until the following code block executes 
    DispatchQueue.main.asyncAfter(deadline: .now() + 3.1) { 
     applicationKeyWindow.bringSubview(toFront: self.backgroundView) 
    } 
} 


func didTapOnMaskView() { 
    hide() 
} 

func show(){ 
    createMaskView() 
} 

** 수정 ** 좀 더 진단을 실행 한 후, 내가 발견 한 것을 내가 전면에 maskView을 제공 내 createMaskView()의 끝 부분에 코드의 3 초 지연 블록을 추가하는 경우, 제스처는 해당 코드 블록이 실행될 때까지 처음 3.1 초 동안 작동합니다. 해당 코드 블록이 없으면 제스처 인식기가 전혀 작동하지 않습니다 (3.1 초도 걸리지 않음).

답변

0

결과적으로 내 maskView가 포함 된 뷰에 대한 참조를 유지 관리하지 않는 것이 문제였습니다.

// Stored property on my View Controller class 
var myPopupView: UIView? 

private func showLMBFormSubmittedPopup(){ 
    let popupView = MyPopupView() 
    popupView.show() 

    // Once I added this line, it started working 
    myPopupView = popupView 
} 

은 아마도 누군가가 왜이 발생 되거 수 : 다음과 같이보기를 생성의 ViewController에서 나는 내 showPopUp() 기능을 변경했습니다. 내 코드가 더 이상 참조하지 않기 때문에 ARC가 내 UITapGestureRecognizer이 차지하는 메모리를 확보하고있는 것으로 판단됩니다.

0

배경보기의 크기가 수퍼 뷰와 같기 때문에 구속 조건을 사용하는 대신 프레임 크기를 설정할 수 있습니다.

비슷한 상황에서 과거에 나를 위해 일했다

let backgroundView = UIView(frame: applicationKeyWindow.frame)

.

도움이 되었기를 바랍니다. 좋은 하루 되세요!

+0

불행히도 아직 연락을받을 수 없습니다. 아무것도 바꾸지 않는 것 같아 ... – toddg

+0

제스처 인식기를 적용하기 전에 이상하게 보일 수 있지만 제약 조건을 활성화 할 수는 있습니다. – KGJ

+0

UIScreen 윈도우 경계 'UIView (frame : UIScreen.main.bounds)'를 사용했습니다. – KGJ