Anonymous
Как добиться такой анимации с текстом-заполнителем в UIKit?
Сообщение
Anonymous » 11 апр 2024, 22:02
Это код, который я использую для этого:
Код: Выделить всё
import UIKit
class ViewController: UIViewController, UISearchBarDelegate {
var placeholderIndex = 0
var placeholderTexts = ["Text 1", "Text 2", "Text 3"]
var searchBar: UISearchBar!
override func viewDidLoad() {
super.viewDidLoad()
searchBar = UISearchBar()
searchBar.placeholder = "Search...." // Set initial placeholder
searchBar.searchBarStyle = .prominent
searchBar.sizeToFit()
searchBar.isTranslucent = true
searchBar.delegate = self
searchBar.backgroundImage = UIImage()
searchBar.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(searchBar)
Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(updatePlaceholder), userInfo: nil, repeats: true)
NSLayoutConstraint.activate([
searchBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
searchBar.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
searchBar.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
searchBar.heightAnchor.constraint(equalToConstant: 70)
])
}
@objc func updatePlaceholder() {
let nextPlaceholderLabel = UILabel(frame: CGRect(x: 0, y: -searchBar.frame.height, width: searchBar.frame.width, height: searchBar.frame.height))
nextPlaceholderLabel.text = placeholderTexts[placeholderIndex]
nextPlaceholderLabel.textAlignment = .center
nextPlaceholderLabel.font = searchBar.searchTextField.font
nextPlaceholderLabel.textColor = searchBar.searchTextField.textColor
searchBar.addSubview(nextPlaceholderLabel)
UIView.animate(withDuration: 0.5, animations: {
nextPlaceholderLabel.frame.origin.y = 0
nextPlaceholderLabel.alpha = 1.0
self.searchBar.layoutIfNeeded()
}) { _ in
self.searchBar.placeholder = self.placeholderTexts[self.placeholderIndex]
nextPlaceholderLabel.removeFromSuperview()
}
placeholderIndex = (placeholderIndex + 1) % placeholderTexts.count
}
}
Функция updatePlaceholder() должна была обеспечить эту анимацию, однако мой результат выглядит примерно так:
Какие изменения мне нужно здесь сделать?
Заранее спасибо
Подробнее здесь:
https://stackoverflow.com/questions/782 ... t-in-uikit
1712862132
Anonymous
[img]https://i.stack.imgur.com/ADb91.gif[/img] Это код, который я использую для этого: [code]import UIKit class ViewController: UIViewController, UISearchBarDelegate { var placeholderIndex = 0 var placeholderTexts = ["Text 1", "Text 2", "Text 3"] var searchBar: UISearchBar! override func viewDidLoad() { super.viewDidLoad() searchBar = UISearchBar() searchBar.placeholder = "Search...." // Set initial placeholder searchBar.searchBarStyle = .prominent searchBar.sizeToFit() searchBar.isTranslucent = true searchBar.delegate = self searchBar.backgroundImage = UIImage() searchBar.translatesAutoresizingMaskIntoConstraints = false view.addSubview(searchBar) Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(updatePlaceholder), userInfo: nil, repeats: true) NSLayoutConstraint.activate([ searchBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20), searchBar.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20), searchBar.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20), searchBar.heightAnchor.constraint(equalToConstant: 70) ]) } @objc func updatePlaceholder() { let nextPlaceholderLabel = UILabel(frame: CGRect(x: 0, y: -searchBar.frame.height, width: searchBar.frame.width, height: searchBar.frame.height)) nextPlaceholderLabel.text = placeholderTexts[placeholderIndex] nextPlaceholderLabel.textAlignment = .center nextPlaceholderLabel.font = searchBar.searchTextField.font nextPlaceholderLabel.textColor = searchBar.searchTextField.textColor searchBar.addSubview(nextPlaceholderLabel) UIView.animate(withDuration: 0.5, animations: { nextPlaceholderLabel.frame.origin.y = 0 nextPlaceholderLabel.alpha = 1.0 self.searchBar.layoutIfNeeded() }) { _ in self.searchBar.placeholder = self.placeholderTexts[self.placeholderIndex] nextPlaceholderLabel.removeFromSuperview() } placeholderIndex = (placeholderIndex + 1) % placeholderTexts.count } } [/code] Функция updatePlaceholder() должна была обеспечить эту анимацию, однако мой результат выглядит примерно так: [img]https://i.stack.imgur.com/6HgGK.gif[/img] Какие изменения мне нужно здесь сделать? Заранее спасибо Подробнее здесь: [url]https://stackoverflow.com/questions/78292047/how-to-achieve-this-kind-of-animation-with-the-placeholder-text-in-uikit[/url]