2016-12-11 1 views
1

나는 드래그 가능한 버튼을 가지고 있습니다. 사용자가 화면을 드래그하여 화면의 가장자리가 잘리지 않도록하고 싶습니다.draggable view가 화면에서 벗어나는 것을 방지합니다.

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
      if let touch = touches.first { 
       let position = touch.location(in: self.superview) 

       self.center = CGPoint(x: position.x, y: position.y) 

       } 

      } 

내가하고있는 방식은 화면의 허용 된 영역을 확인하는 거대한 기차 if/else 문입니다.

let halfOfButton = CGFloat(85/2) 
      let heightOfTopBar = CGFloat(55) + halfOfButton 
      let widthOfScreen = CGFloat((self.superview?.frame.width)!) - halfOfButton 
      let heightOfScreen = CGFloat((self.superview?.frame.height)!) - heightOfTopBar 

      let heightOfBotBar = CGFloat((self.superview?.frame.height)! - heightOfTopBar) 


      if position.x > halfOfButton && position.x < widthOfScreen { 
       self.center = CGPoint(x: position.x, y: position.y) 

      } else { 
       if position.x < halfOfButton { 
       self.center = CGPoint(x: halfOfButton, y: position.y) 
       } else { 
         self.center = CGPoint(x: widthOfScreen, y: position.y) 
       } 
      } 

      if position.y > heightOfTopBar && position.y < heightOfScreen && position.x > halfOfButton && position.x < widthOfScreen { 
       self.center = CGPoint(x: position.x, y: position.y) 

      } else { 
       if position.y < heightOfTopBar { 
        self.center = CGPoint(x: position.x, y: heightOfTopBar) 
       } else { 
        self.center = CGPoint(x: position.x, y: heightOfScreen) 
       } 
      } 
     } 

더 좋은 방법이 있나요? 위의 코드는 아직 완전히 작동하지 않습니다. "Y가 괜찮 으면 로직의 결함이 많습니다. 그렇다면 터치의 중심을 버튼의 중심으로 허용하십시오."그런 다음 X에서 쓰는 코드를 재정의합니다. Y가 괜찮을지라도 X는 그렇지 않습니다.

이 방법으로 논리를 추출하는 것이 가능하지만 확실한 방법은이 방법을 사용하는 것입니다. 이 같은

답변

2

시도 뭔가 :

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
if let touch = touches.first { 
    let position = touch.location(in: self.superview) 

    var x:CGFloat = position.x 
    var y:CGFloat = position.y 

    let parentWidth = button.superView!.frame.size.width 
    let parentHeight = button.superView!.frame.size.height 

    let width = button.frame.size.width/2 
    let height = button.frame.size.height/2 

    x = max(width, x) 
    x = min(x, parentWidth - width) 

    y = max(height, y) 
    y = min(y, parentHeight - height) 



    self.center = CGPoint(x: x, y: y) 

} 

}

+0

전에 최소/최대 내용을 보지 못했습니다. 완벽하게 작동합니다. 감사합니다! – user6820041

1

나는 잠시 다시이 문제를 처리하고이 방법으로 해결.

먼저 단추의 크기를 고려하고 단추의 일부를 잘라내지 않으려면 단추를 표시 할 영역 위에 배치 된보기 (이 예제에서는라고합시다)를 만듭니다. 이보기에서는 수퍼 뷰에서 여백을 줄여서 위쪽에 & 아래쪽 여백을 단추의 높이의 절반으로 지정해야합니다. & 후행 가장자리는 단추 너비의 절반입니다.

이 설정을 사용하면 if 문없이 더 나은 성능을 제공하는 내장 함수로 이동을 포함하는 것이 매우 쉽습니다.

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    super.touchesMoved(touches, with: event) 

    guard let touch = touches.first else { 
     return 
    } 

    let location = touch.location(in: containerView) 

    if containerView.point(inside: location, with: event) { 
     button.center = location 
    } 
} 

이제는 사용중인 좌표계에 따라이 기술로 원하는 곳에 단추가 제대로 배치되지 않을 수도 있습니다. 그럴 경우 위치 값을 button.center 속성에 지정하기 전에 위치 값을 수정하여이를 해결할 수 있어야합니다.

변경하려면 상단 여백 &을 기준으로 오른쪽 또는 아래쪽으로 이동해야합니다. 이상적으로는 스토리 보드 제약 조건을 사용하여 컨트롤러에 연결할 수 있으므로 이러한 값을 직접 조정할 수 있습니다.

관련 문제