2016-06-27 3 views
1

У меня есть 3 кнопки в моем интерфейсе, которые в конечном итоге будут работать аналогично клавишам на фортепиано. Любая из трех кнопок может быть задействована для выполнения определенных действий кнопок, но пользователь может «сдвинуть» свой палец на следующую кнопку, чтобы выполнить действие кнопки 2.Проведите пальцем по 3 кнопкам - Xcode & Swift

Я сделал несколько поисков, и это похоже на touchsBegan метод обнаружения местоположения крана лучше. Моя попытка ниже:

@IBOutlet weak var button1: UIButton! 
@IBOutlet weak var button2: UIButton! 
@IBOutlet weak var button3: UIButton! 

(у меня нет каких-либо событий действий, привязанных к 3 кнопки, потому что я думал, что touchesBegan будет охватывать это.)

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    var touch: UITouch = event!.allTouches()!.first! 
    var location: CGPoint = touch.locationInView(touch.view!) 
    if CGRectContainsPoint(button1.frame, location){ 
     print("button 1") 
    } 
    else if CGRectContainsPoint(button2.frame, location) { 
     print("button 2") 
    } 
    else if CGRectContainsPoint(button3.frame, location) { 
     print("button 3") 
    } 

} 

Принтер не печатает на консоль когда я проверяю это. Я тестировал как нажатие, так и прокрутку кнопок. Должен ли я использовать UIViews вместо UIButtons? Должен ли я использовать действия на кнопках? Это для Swift 2.0. Спасибо.

EDIT

У меня есть рабочий прототип гораздо ближе к тому, как я предполагал эту работу. Эта тема здесь: Using iOS pan gesture to highlight buttons in grid указал мне в сторону использования pangesture на кнопках superiew.

var touchPoint = CGPoint() 
var myGesture = UIPanGestureRecognizer() 

viewDidLoad:

myGesture = UIPanGestureRecognizer(target: self, action: Selector("panDetected:")) 
    myGesture.maximumNumberOfTouches = 1 
    view.addGestureRecognizer(myGesture) 

.

func panDetected(sender : UIPanGestureRecognizer) { 
    touchPoint = sender.locationInView(self.view) 


     if CGRectContainsPoint(button1.frame, touchPoint) { 
      button1Func() 
     } 

     else if CGRectContainsPoint(button2.frame, touchPoint) { 
      button2Func() 
     } 

     else if CGRectContainsPoint(button3.frame, touchPoint) { 
      button3Func() 
     } 

выше работает, однако, button1Func/button2Func/button3Func содержат блок анимации. Когда палец перетаскивается внутри кнопок, он запускает метод каждый раз, когда обнаружено движение. Мне просто нужно, чтобы это произошло однажды. Я попытался добавить это в оператор состояния == .Began, но это предотвратит любую функциональность, как только палец покинет первую нажатую кнопку.

Есть ли способ, которым я могу запускать эти методы (button1Func/button2Func/button3Func) только один раз в жесте, когда палец находится внутри границ каждой из трех кнопок? Я буду рад прояснить это, если это сбивает с толку. БЛАГОДАРЮ.

ответ

1

Есть целая куча контрольных событий, которые вы можете связать с IBActions. Взгляните на перечисление UIControlEvents. Возможно, вы захотите добавить действия для UIControlEventTouchDragInside, UIControlEventTouchDragEnter и некоторых других.

+0

Я пробовал все возможные комбинации, о которых я мог думать с помощью UIControlEvents ... https://developer.apple.com/reference/uikit/uicontrolevents#symbols - Ничто не регистрирует без видимых действий переход от одного слайда к другому. Когда вы говорите «и несколько других», можете ли вы быть более конкретными? Боюсь, что этот маршрут заводит меня с потенциально очень раздутым диспетчером. Я надеялся использовать выходы, как в моей попытке кода выше, так как это значительно более управляемо. – Joe

+0

Я не пытался делать то, что вы делаете, поэтому мне пришлось бы экспериментировать. Использование touchhesBegan/touchesMoved/touchesEnded в супервизоре, которое содержит кнопки, тоже будет работать, и может сделать код более чистым, чем попытка присоединить кучу цели/действий к вашим кнопкам, чтобы обнаружить различные случаи нажатия/скольжения. –

+0

Взгляните на мое редактирование. Я очень близок к желаемому результату, но имею причудливый результат с pangesture. – Joe

Смежные вопросы