2016-12-11 21 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.

Модификация должна заключаться в том, чтобы сдвинуть ее вправо или вниз на основе ведущих верхних полей &. В идеале для этого вы должны использовать ограничения для раскадровки, которые затем можно связать с вашим контроллером, позволяя напрямую получать эти значения для настройки.