2016-12-13 4 views
2

Я пытаюсь реализовать UIButton's эффект гладкого касания, как мы используем калькулятор в наших устройствах iPhone. Однако я пробовал код в Objective c и Swift, но нашел тот же результат, который не соответствует желанию.UIButton smooth touch effect

Попробовал код:

@IBAction func someAction(sender: UIButton){ 
    button.setBackgroundColor(UIColor.blackColor(), forState: UIControlState.Highlighted) 
} 

// using extension 
extension UIButton { 
    func setBackgroundColor(color: UIColor, forState: UIControlState) { 
     UIGraphicsBeginImageContext(CGSize(width: 1, height: 1)) 
     CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), color.CGColor) 
     CGContextFillRect(UIGraphicsGetCurrentContext(), CGRect(x: 0, y: 0, width: 1, height: 1)) 
     let colorImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     self.setBackgroundImage(colorImage, forState: forState) 
    }} 

Объяснение: приведенный выше код работает отлично, как мне нужно, но приложенное эффект не так гладко. Фактически, когда я нажимаю кнопку, для нанесения фонового изображения на него требуется нано-секунда, и когда я отпускаю сенсорное изображение, внезапно исчезает фоновое изображение.

Я также пробовал это в Objective c используя TouchUpInside и TouchDown событие но результат был найден.

Спасибо за ваше время.

+0

Медленная часть - это обработка CoreGraphics в расширении кнопки. почему вы не можете использовать UIButton setBackgroundColor для изменения цвета? – GeneCode

+0

@GeneCode это не об изменении цвета, а о применении эффекта над кнопкой. – vaibhav

ответ

1

Комплексное решение: использованием CABasicAnimation и добавление слоя над кнопкой.

@IBAction func someAction(sender: UIButton){ 
    let colorAnimation = CABasicAnimation(keyPath: "backgroundColor") 
    colorAnimation.fromValue = UIColor.redColor().CGColor 
    colorAnimation.duration = 1 // animation duration 
    // colorAnimation.autoreverses = true // optional in my case 
    // colorAnimation.repeatCount = FLT_MAX // optional in my case 
    sender.layer.addAnimation(colorAnimation, forKey: "ColorPulse") 
} 

Ссылка: в качестве пользователя iOS_devloper comment.

1

Назначьте свойство для своей кнопки и поместите этот код в viewDidLoad.

yourButton.setBackgroundColor(UIColor.blackColor(), forState: UIControlState.Highlighted) 

Проблема была в том, что вы установили ее только при нажатии пользователем. Этот код требует времени, поскольку он использует CoreGraphics. Вы можете сразу установить фоновый img для выделенного состояния в viewdidload, и он останется там и будет немедленно вызван, когда вы нажмете кнопку.

+0

Подождите некоторое время, позвольте мне применить это. – vaibhav

+0

ваш код работает нормально, как я делаю, но вопрос все еще остается таким, какой он есть. – vaibhav

1

Создать подкласс UIButton и переопределить выделенное свойство:

override var highlighted: Bool { 
     get { 
      return super.highlighted 
     } 
     set { 
      if newValue { 
       backgroundColor = UIColor.blackColor() 
      } 
      else { 
       backgroundColor = UIColor.whiteColor() 
      } 
      super.highlighted = newValue 
     } 
    } 
+0

позвольте мне попробовать. – vaibhav

+1

и если вы хотите какую-то анимацию при изменении цвета фона от выделенного до нормального .. вы можете добавить анимацию при изменении цвета фона - пусть colorAnimation = CABasicAnimation (keyPath: "backgroundColor") colorAnimation.fromValue = UIColor.redColor() .CGColor colorAnimation.toValue = UIColor.blueColor() CGColor colorAnimation.duration = 1 colorAnimation.autoreverses = истинная colorAnimation.repeatCount = FLT_MAX self.layer.addAnimation (ColorAnimation, forKey: "ColorPulse"). – Darshana