2016-12-11 66 views
1

我有一個可拖動的按鈕,我不希望用戶能夠拖動視圖,因此兩邊被屏幕邊緣切斷。防止可拖動的視圖脫離屏幕

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

我處理這個問題一段時間回來,並用這種方法解決了這個問題。首先,爲了說明按鈕的大小,而不是想要剪裁它的一部分,我創建了一個視圖(對於這個例子,我們稱之爲containerView),它放置在你想要按鈕出現的區域上此視圖需要從超級視圖中減少其邊距,使其底部邊距是按鈕高度的一半,並且是領先的&後邊緣是按鈕寬度的一半。

通過設置,現在使用內置函數來包含其運動並非易事,因爲該函數在沒有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屬性之前修改位置值來解決它。

修改應該是根據您的主要&頂部邊距向右或向下移位。理想情況下,您可以使用故事板約束,然後您可以鏈接到您的控制器,讓您直接獲取這些值進行調整。