2015-01-19 4 views
3

나는 UIButtonUISlider을 포함하여보기에 하위보기의 복잡한 계층 구조가있는 UIViewController 하위 클래스가 있습니다. 사용자 상호 작용없이 5 초가 지나면 컨트롤을 숨기려고합니다. 5 초 부분은 간단합니다. 타이머를 사용하십시오. 나는 사용자 상호 작용을 감지하는 일반적인 방법을 알지 못합니다.UIViewController 수준에서 시작되고 이동 된 모든 접촉을 알리는 일반적인 방법이 있습니까?

내 첫번째 생각은 UIViewController 서브 클래스에서 UIRespondertouchesBegan:withEvent:touchesMoved:withEvent:을 무시했지만, 사용자가 UIButton을 탭하거나 UISlider에 손잡이를 드래그 할 때 그 호출되지 않습니다.

내가 돕고 싶으면 모든 컨트롤의 알림에 등록하고 싶지 않습니다. 나는 또한 UIWindow을 엉망으로 만들고 싶지 않습니다. 다른 아이디어?

답변

3

나는 연속을 만들어 결국 제스처 인식기는 적어도 하나의 터치가있을 때이를 인식합니다. 내가 UIViewController 하위 클래스의보기에 추가하고 잘 작동합니다! cancelsTouchesInViewdelaysTouchesEnded을 모두 false으로 설정해야한다는 것을 깨닫는 데 오랜 시간이 걸렸습니다. 그렇지 않으면 어떤 식 으로든 실패합니다.

class TouchDownGestureRecognizer: UIGestureRecognizer { 

    override init(target: AnyObject, action: Selector) { 
     super.init(target: target, action: action) 

     cancelsTouchesInView = false 
     delaysTouchesEnded = false 
    } 

    override func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) { 
     state = .Began 
    } 

    override func touchesEnded(touches: NSSet!, withEvent event: UIEvent!) { 
     if numberOfTouches() - touches.count == 0 { 
      state = .Ended 
     } 
    } 

    override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) { 
     if numberOfTouches() - touches.count == 0 { 
      state = .Cancelled 
     } 
    } 

    override func shouldBeRequiredToFailByGestureRecognizer(otherGestureRecognizer: UIGestureRecognizer!) -> Bool { 
     return false 
    } 

    override func shouldRequireFailureOfGestureRecognizer(otherGestureRecognizer: UIGestureRecognizer!) -> Bool { 
     return false 
    } 

    override func canPreventGestureRecognizer(preventedGestureRecognizer: UIGestureRecognizer!) -> Bool { 
     return false 
    } 

    override func canBePreventedByGestureRecognizer(preventingGestureRecognizer: UIGestureRecognizer!) -> Bool { 
     return false 
    } 

} 
0

UIGestureRecognizer을 사용하지 않는 이유는 무엇입니까? 보류 및 스 와이프와 같은 가능한 상호 작용 유형에 대해 서로 다른 몇 가지 상호 작용 유형을 설정해야 할 수도 있지만, 모두 화면을 켜고 타이머를 재설정하는 동일한 기능을 호출 할 수 있습니다.

1

있는 viewDidLoad

- (void)setupTapGesture 
{ 
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toggleVisibility)]; 
    tapGesture.delegate = self; 
    [self.view addGestureRecognizer:tapGesture]; 
} 

을 setupTapGesture를 호출하여의 UIViewController에 UIGestureRecognizer를 추가 한 후 버튼에서 터치를 감지하는이 콜백을 사용하여, 슬라이더 (UIControl)

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
     //To ignore touches from Player Controls View 
     if ([[touch.view superview] isKindOfClass:[UIControl class]]) 
     { 
      return NO; 
     } 
     return YES; 
} 
+0

감사합니다. 나는 단지'gestureRecognizer : shouldReceiveTouch :'로 작업하는 것을 결코 얻지 못했지만 커스텀 제스처 인식기가 그 트릭을 수행했다. –