2016-11-27 4 views
4

У меня есть число UIButton экземпляров в UIViewController, и я хочу выполнить пару действий, когда любая из этих кнопок нажата с нажатием (полностью вниз), я не делаю Не знаете здесь точный термин (возможно, контакт с силой)?Лучший способ выполнить действие на 3D Touch на UIButton

Поэтому, когда давление UIButton надавлено, я хочу дать гаплотную обратную связь через вибрацию, изменить источник изображения кнопки и сделать некоторые другие вещи. Затем, когда давление отпускается, я хочу восстановить источник изображения кнопки в нормальном состоянии и сделать еще несколько вещей.

Что такое самый простой способ сделать это?

Должен ли я сделать свой собственный UIButton, как показано ниже, или есть методы, которые можно переопределить для трехмерного нажатия «нажатие» и «выделение».

Это мой пользовательский код UIButton. Должен ли я определить, с помощью проб и ошибок, какой должна быть максимальная сила? Также как я могу изменить источник изображения для каждой кнопки самым простым способом?

import AudioToolbox 
import UIKit 

class customButton : UIButton { 
    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     for touch in touches { 
      print("% Touch pressure: \(touch.force/touch.maximumPossibleForce)"); 
      if touch.force > valueThatIMustFindOut { 
       AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate)) 
       // change image source 
       // call external function 
      } 
     } 
    } 

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     print("Touches End") 
     // restore image source 
     // call external function 
    } 
} 

Пожалуйста, обратите внимание, что я новичок в Swift, поэтому я хотел бы использовать графический интерфейс в Xcode для создания пользовательского интерфейса как можно больше. Поэтому я хотел бы избежать создания пользовательского интерфейса из кода.

ответ

2

Что касается силы прикосновения - вам нужно определить, доступен ли первый:

func is3dTouchAvailable(traitCollection: UITraitCollection) -> Bool { 
    return traitCollection.forceTouchCapability == UIForceTouchCapability.available 
} 

if(is3dTouchAvailable(traitCollection: self.view!.traitCollection)) { 
    //... 
} 

, а затем в, например, touchesMoved он будет доступен как touch.force и touch.maximumPossibleForce

func touchMoved(touch: UITouch, toPoint pos: CGPoint) { 
    let location = touch.location(in: self) 
    let node = self.atPoint(location) 

    //... 
    if is3dTouchEnabled { 
     bubble.setPressure(pressurePercent: touch.force/touch.maximumPossibleForce) 
    } else { 
     // ... 
    } 
} 

Вот более подробный пример с примерами кода: http://www.mikitamanko.com/blog/2017/02/01/swift-how-to-use-3d-touch-introduction/

Это также хорошая практика, чтобы реагировать на такую ​​«силу касания "с тактильной/taptic обратной связью, поэтому пользователь почувствует прикосновение:

let generator = UIImpactFeedbackGenerator(style: .heavy) 
generator.prepare() 

generator.impactOccurred() 

Возможно, вам захочется чтобы посмотреть на это сообщение для деталей: http://www.mikitamanko.com/blog/2017/01/29/haptic-feedback-with-uifeedbackgenerator/

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

  • Нет связанных вопросов^_^