2016-11-18 8 views
1

내 기본보기에서 UIViewController mapView 및 다른보기 (보기 A) mapView 위에 있습니다. 둘 다 self.view.bounds와 같은 프레임을가집니다. 뷰 A는 이미지 자르기에 사용되는 것과 비슷한 크기 조정이 가능한 사각형입니다. 내 목표는 사용자가지도에서 영역을 지정하도록하는 것입니다. 따라서 사용자가지도 밖으로 확대하고 사각형 A 및 B의 비율을 변경할 수 있기를 원합니다.보기 A를 실현 불가능한 사각형으로 지정하면 너무 많이 제한되므로 사각형 너비와 높이 비율을 변경해야합니다.내부에서 터치를 취소 할 수 있습니까? 예 : Began 또는 touchesMoved?

크기 조정이 가능한 직사각형 기능을 사용하고있는 GitHub https://github.com/justwudi/WDImagePicker에서이 프로젝트를 받았습니다. Github 링크의 두 번째 그림에는 8 개의 점과 바깥에 음영 처리 된 영역이있는 직사각형이 있습니다. 사용자가 음영 처리 영역을 터치하면보기 A 뒤에있는지도로 터치가 전달되도록 할 수 있습니다. 사용자가 점 안이나 점 위에있는 영역을 클릭하여 (사각형의 크기를 조정할 수 있도록) 뷰 A가 터치를 인식하기를 원합니다. 그래서, 내가보기 A의 터치에 코드를 수정이 있습니다 : 참으로 내가 원하는대로 내가 내부와 외부를 클릭 터치를 인식하지만, 나는 바깥 쪽을 클릭 할 때 터치를 중지하지 않는

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first { 

     if cropBorderView.frame.contains(touch.location(in: self)){ 
      print("touch contains - touchesbegan") 
      //self.isUserInteractionEnabled = true 
     } 
     else{ 
      print("Touch does not contain - touchesbegan") 
      self.touchesCancelled(touches, with: event) 
      //return 
     } 
     let touchPoint = touch.location(in: cropBorderView) 

     anchor = self.calculateAnchorBorder(touchPoint) 
     fillMultiplyer() 
     resizingEnabled = true 
     startPoint = touch.location(in: self.superview) 
    } 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    print("inside touches moved") 
    if let touch = touches.first { 
     if cropBorderView.frame.contains(touch.location(in: self)){ 
      print("touch contains - touchesmoved") 
      //self.isUserInteractionEnabled = true 
     } 
     else{ 
      print("Touch does not contain - touchesmoved ") 
      self.touchesCancelled(touches, with: event) 
      //return 
     } 

     if resizingEnabled! { 
      self.resizeWithTouchPoint(touch.location(in: self.superview)) 
     } 
    } 
} 

. 이것은 self.touchesCancelled(touches, with: event) 호출이 작동하지 않는다는 것을 의미합니다. 반환 값을 호출하면 충돌이 발생하고 작동하지 않습니다. 이 문제에 대한 해결책이 있습니까?

시간 내 주셔서 감사드립니다.

답변

0

touchesCancelled(_:with:)UITouch에 대한 알림 일 뿐이므로이 방법으로 작동하지 않습니다.

else { 
    print("Touch does not contain - touchesmoved ") 
    self.cancelTracking(with event) 
} 

업데이트 솔루션 : 은 지금까지 내가 이해, 당신은 만약 그렇다면, 당신은 UIControl 클래스 implementation에서 cancelTracking(with:) 기능을 self.touchesCancelled(touches, with: event)에 대한 호출을 대체 할 시도 할 수 있습니다, 오버레이 UIView에 터치 핸들러를 구현 , 기준으로 hitTest:

나는 가능한 해결책을 확인했으며을 사용할 수있는 것으로 보입니다. 불필요한 터치 인식을 피하기 위해. 다음 예제는 Swift Playground입니다. 터치하면 터치하여 터치하여 콘솔에서 어떤 일이 발생하는지 볼 수 있습니다.

import UIKit 
import PlaygroundSupport 

class JSGView : UIView { 

    var centerView = UIView() 

    override func didMoveToSuperview() { 
     frame = CGRect(x: 0, y: 0, width: 320, height: 480) 
     backgroundColor = UIColor.clear 

     centerView.frame = CGRect(x: 110, y: 190, width: 100, height: 100) 
     centerView.backgroundColor = UIColor.blue 
     addSubview(centerView) 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     dump(event) 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     if let touch = touches.first { 
      if (hitTest(touch.location(in: self), with: event) != nil) { 
       print("Touch passed hit test and seems valid") 
       super.touchesCancelled(touches, with: event) 
       return 
      } 
     } 

     print("Touch isn't passed hit test and will be ignored") 
     super.touchesMoved(touches, with: event) 
    } 

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 
     if centerView.bounds.contains(centerView.convert(point, from: self)) { 
      return centerView 
     } 
     return nil 
    } 
} 

class JSGViewController : UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.frame = CGRect(x: 0, y: 0, width: 320, height: 480) 
     let customView = JSGView() 
     view.addSubview(customView) 
    } 
} 

let controller = JSGViewController() 
PlaygroundPage.current.liveView = controller.view 
+0

이 클래스는 UIView에서만 상속받습니다. UIControl에서 상속 받도록 만들려고 할 때 "UIView 및 UIControl에서 다중 상속"오류가 발생합니다. – rgoncalv

+0

위의 문제가 해결되었습니다. UIControl이 UIView에서 상속 받았다는 것을 깨달았습니다. 그러나 self.cancelTracking (이벤트 사용)을 호출하면 예상 한 결과가 제공되지 않습니다. self.touchesCancelled (touch, with : event)와 같이 아무 일도 일어나지 않습니다. – rgoncalv

+0

이 코드는 iOS 10.0 ...에서 잘 작동하지만 iOS 11.0 버전에서는 작동하지 않습니다 .... 최신 코드를 제공하십시오 ..... 미리 감사드립니다. –