Анимация кастомной navigationButton


#1

Есть кастомная navigationButton с кодом:

 fileprivate func navigationButton() {
    let button = UIButton(type: .custom)
    button.frame = CGRect(x: 0, y: 0, width: 600, height: 40)
    button.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
    button.setTitleColor(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), for: .normal)
    button.setTitle("какой-то текст", for: .normal)
    button.addTarget(self, action: #selector(clickedButton), for: .touchUpInside)
    self.navigationItem.titleView = button
}

функция clickedButton вызывает Safari. Как сделать пульсирующую анимацию для этой кнопки с текстом “какой-то текст” на подобии https://media.giphy.com/media/3JUsda8zZiFvQD0ioo/giphy.gif?


#2

Очень похоже на Lottie


#3

@RexHunt спасибо, изучу. И еще небольшой вопрос: с сервера приходит цвет текста кнопки в виде строки red: 1, green: 0.556, blue: 0.232, alpha: 1, условно. Как присвоить этот цвет button.backgroundColor?


#4

UIColor(red: 1/255.0, green: 0.556/255.0, blue: 0.232/255.0, alpha: 1.0)


#5

@RexHunt

let colorServer: String = ""
let color: UIColor!
button.setTitleColor(color, for: .normal)

Дальше я получаю с сервера
colorServer = red: 1, green: 0.556, blue: 0.232, alpha: 1
Как полученную строку с данными цвета обернуть в UIColor?. Я же не могу написать

color = UIColor(colorServer) и потом подставить color в button.setTitleColor(color, for: .normal)


#6

а разве цвет не идет в диапазоне от 0…1? может @Putilov прав с


#7

Кто так цвета отдает с сервера. Убил бы за такое.
Просите что бы нормально цвет возвращали.
Либо все разнести по отдельным свойствам, либо возвращать готовый hex, на крайний случай только цифры.

И вашем случае (не обратил сразу внимание) деление на 255 не нужно.


#8

Вариант! А если возвращается hex, например 000000, как быть с ним, как его в UIColor обернуть?


#9
extension UIColor {
   convenience init(red: Int, green: Int, blue: Int) {
       assert(red >= 0 && red <= 255, "Invalid red component")
       assert(green >= 0 && green <= 255, "Invalid green component")
       assert(blue >= 0 && blue <= 255, "Invalid blue component")

       self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0)
   }

   convenience init(rgb: Int) {
       self.init(
           red: (rgb >> 16) & 0xFF,
           green: (rgb >> 8) & 0xFF,
           blue: rgb & 0xFF
       )
   }
}

Применение let color = UIColor(rgb: 0x000000)


#10
extension UIColor {

public convenience init(hexString: String, alpha: CGFloat = 1.0) {
	let hexString: String = hexString.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
	let scanner = Scanner(string: hexString)
	if (hexString.hasPrefix("#")) {
		scanner.scanLocation = 1
	}
	var color: UInt32 = 0
	scanner.scanHexInt32(&color)
	let mask = 0x000000FF
	let r = Int(color >> 16) & mask
	let g = Int(color >> 8) & mask
	let b = Int(color) & mask
	let red = CGFloat(r) / 255.0
	let green = CGFloat(g) / 255.0
	let blue = CGFloat(b) / 255.0
	self.init(red:red, green:green, blue:blue, alpha:alpha)
}

UIColor(hex: "#ffffff")


#11

Я прошу прощение за дотошность, но у меня не сходится.
Вводные:

     var сolorServer: String = ""
     var сolor: UIColor!

       ref.child("color").observeSingleEvent(of: .value, with: { (snapshot) in
        self.сolorServer = snapshot.value as! String
                    print("Color:", self.сolorServer) - в консоле выводятся данные с сервера, например, 232323
        if self.сolorServer == "" {
            self.сolor = UIColor(rgb: 000000)
            
        } else {
            self.сolor = UIColor(rgb: Int(self.сolorServer)!) - здесь вылетает ошибка 

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

         }
       })

#12

Я же показал как применять
let color = UIColor(rgb: 0x000000)

Либо возьмите пример с хексом от Dimarious


#13

Вот я и пытаюсь получить именно в таком виде

self.сolor = UIColor(rgb: Int(self.сolorServer)!)

0x000000 я должен получить с сервера, но вылезает ошибка Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value


#14

Разобрался. Спасибо за помощь!


#15

и решением было…


#16

Получение UIColor из HEX-строки

так часто бывает, вроде везде поискал ответ на свой вопрос, создаешь тему и в процессе находишь нужное под носом)

Мой код, используя расширение из ссылки:

     var сolorServer: String = ""
     var сolor: UIColor!

ref.child("color").observeSingleEvent(of: .value, with: { (snapshot) in
            self.сolorServer = snapshot.value as! String
                        print("Color:", self.сolorServer)
            
            if self.сolorServer == "" {
                self.сolor = "000000".hexColor
            } else {
                self.сolor = "\(self.сolorServer)".hexColor
            }
        })