2017-12-05 5 views
0

해당 UIView 다시 0 알파 변경 후에는 마개를 등록하지 않는 제스처 headerView이다스위프트 : 인식기 1

if isShown { 
     stack.alpha = 1.0 
     self.isStackShown = true 
     DispatchQueue.main.async { 
      self.headerView.isHidden = !isShown 
      self.stack.addArrangedSubview(self.headerView) 

      // add touch gesture recognizer to stack view header 
      let tapFind = UIGestureRecognizer(target: self, action: #selector(self.handleFindTap)) 
      self.headerView.addGestureRecognizer(tapFind) 
     } 
    } else { 
     stack.alpha = 0.0 
     self.isStackShown = false 
     DispatchQueue.main.async { 
      self.headerView.isHidden = isShown 
      self.stack.removeArrangedSubview(self.headerView) 
     } 
    } 

는 탭 제스처 인식기
self.stack 스택 어떤 도청 가입되지 headerView
headerView을 표시하거나 숨기는 조건이 다른 방법으로 처리되고 있으며 이에 따라 self.isStackShown 부울을이 방법으로 전달하여 그에 따라 표시하거나 숨 깁니다.

+1

https://stackoverflow.com/questions/13499817/does-uibutton-become-disabled-when-its-alpha-is-set-to-0-0 –

+0

다시 추가 한 후'headerView'가 보이십니까? 알파가 1.0으로 설정되면 스택에? –

+0

@SanthoshR 예 스택이 보이고 터치 이벤트 만 등록되지 않습니다. Storyboard에서 userInteraction은 enabled로 확인됩니다. –

답변

1

당신은 UIGestureRecognizer을 사용하고 있습니다. UIGestureRecognizer은 다형성 기본 클래스이며 실제로 서브 클래 싱되어야합니다. UITapGestureRecognizer은 탭을 처리하기위한 구체적인 하위 클래스입니다. 대신 사용하십시오. UIGestureRecognizer 제스처의 종류가 인식 할 작업에 대한 어떠한 고유 정보가 없기 때문에

let tapFind = UITapGestureRecognizer(target: self, action: #selector(self.handleFindTap)) 
self.headerView.addGestureRecognizer(tapFind) 

귀하의 조치가 호출되지 점점 않습니다. 그것의 구체적인 하위 클래스 만 있습니다.

+0

예! 이게 다야! 고맙습니다. @beyowulf –

0

알파를 1.0으로 다시 변경할 때 여러 제스처 인식기를 추가하는 것처럼 보이며 동시에 인식 할 수 없습니다. 헤더 뷰를 숨기거나 제거 할 때 모든 제스처 인식기를 제거하십시오. 헤더 뷰를 더 이상 필요로하지 않으므로 헤더 뷰를 다시 추가 할 때 다시 추가하면 작동합니다. 또는 제스처 인식기가 headerView를 숨길 때 작동하도록 할 수 있습니다. 따라서 헤더 뷰를 추가하기 전에 존재하는지 확인하십시오.

if isShown { 
    stack.alpha = 1.0 
    self.isStackShown = true 
    DispatchQueue.main.async { 
     self.headerView.isHidden = !isShown 
     self.stack.addArrangedSubview(self.headerView) 

     // add touch gesture recognizer to stack view header 
     let tapFind = UIGestureRecognizer(target: self, action: #selector(self.handleFindTap)) 
     self.headerView.addGestureRecognizer(tapFind) 
    } 
} else { 
    stack.alpha = 0.0 
    self.isStackShown = false 
    DispatchQueue.main.async { 
     self.headerView.isHidden = isShown 
     self.headerView.gestureRecognizers?.forEach({self.headerView.removeGestureRecognizer($0)}) 
     self.stack.removeArrangedSubview(self.headerView) 
    } 
} 

또는

if isShown { 
    stack.alpha = 1.0 
    self.isStackShown = true 
    DispatchQueue.main.async { 
     self.headerView.isHidden = !isShown 
     self.stack.addArrangedSubview(self.headerView) 
     if self.headerView.gestureRecognizers?.isEmpty != false{ 
      // add touch gesture recognizer to stack view header 
      let tapFind = UIGestureRecognizer(target: self, action: #selector(self.handleFindTap)) 
      self.headerView.addGestureRecognizer(tapFind) 
     } 
    } 
} else { 
    stack.alpha = 0.0 
    self.isStackShown = false 
    DispatchQueue.main.async { 
     self.headerView.isHidden = isShown 
     self.stack.removeArrangedSubview(self.headerView) 
    } 
} 
+0

@ Santhosh.R 답장을 보내 주셔서 감사합니다. 나는 두 가지 접근법을 시도했는데 그들은 나를 위해 일하지 않는 것 같습니다. 그러나 하나의 강력한 점은 탭을 누르면 선택된 모드로 유지되고 선택 해제되지 않는 'headerView'에 버튼을 추가 할 때입니다. 어떤 생각? –