SWIFT 3
Вот обновление для тех, кому нужна версия Swift!.
Несколько дней назад мне нужно было сделатьчто-то вроде этого.Я загружаю некоторые данные с сервера в соответствии с определенными параметрами, и тем временем я хотел показать другое изображение «загрузки».Я искал вариант сделать это с UIImageView
, но, к сожалению, я не нашел что-то, чтобы сделать это без разделения изображений .gif.Поэтому я решил реализовать решение с использованием UIWebView
и хочу поделиться им:
extension UIView{
func animateWithGIF(name: String){
let htmlString: String = "<!DOCTYPE html><html><head><title></title></head>" +
"<body style=\"background-color: transparent;\">" +
"<img src=\""+name+"\" align=\"middle\" style=\"width:100%;height:100%;\">" +
"</body>" +
"</html>"
let path: NSString = Bundle.main.bundlePath as NSString
let baseURL: URL = URL(fileURLWithPath: path as String) // to load images just specifying its name without full path
let frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height)
let gifView = UIWebView(frame: frame)
gifView.isOpaque = false // The drawing system composites the view normally with other content.
gifView.backgroundColor = UIColor.clear
gifView.loadHTMLString(htmlString, baseURL: baseURL)
var s: [UIView] = self.subviews
for i in 0 ..< s.count {
if s[i].isKind(of: UIWebView.self) { s[i].removeFromSuperview() }
}
self.addSubview(gifView)
}
func animateWithGIF(url: String){
self.animateWithGIF(name: url)
}
}
Я сделал расширение для UIView
, которое добавляет UIWebView
в качестве подпредставления и отображает изображения .gifпросто передавая его имя.
Теперь в моем UIViewController
у меня есть UIView
с именем loadingView, который является моим индикатором загрузки, и всякий раз, когда я хотел показать изображение .gif, я делал что-то подобное:
class ViewController: UIViewController {
@IBOutlet var loadingView: UIView!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
configureLoadingView(name: "loading.gif")
}
override func viewDidLoad() {
super.viewDidLoad()
// .... some code
// show "loading" image
showLoadingView()
}
func showLoadingView(){
loadingView.isHidden = false
}
func hideLoadingView(){
loadingView.isHidden = true
}
func configureLoadingView(name: String){
loadingView.animateWithGIF(name: "name")// change the image
}
}
, когда я хотел изменить изображение в формате gif, просто вызывал функцию configureLoadingView()
с именем моего нового изображения .gif и вызывал showLoadingView()
, hideLoadingView()
правильно, все работает нормально !.
НО ...
... если изображение разделено, то вы можете анимировать его в одну строку с помощью статического метода UIImage
с именем UIImage.animatedImageNamed
, например:
imageView.image = UIImage.animatedImageNamed("imageName", duration: 1.0)
Из документов:
Этот метод загружает серию файлов, добавляя ряд чисел к базовому имени файла, указанному в параметре name.Все изображения, включенные в анимированное изображение, должны иметь одинаковый размер и масштаб.
Или вы можете сделать это с помощью метода UIImage.animatedImageWithImages
следующим образом:
let images: [UIImage] = [UIImage(named: "imageName1")!,
UIImage(named: "imageName2")!,
...,
UIImage(named: "imageNameN")!]
imageView.image = UIImage.animatedImage(with: images, duration: 1.0)
Из документов:
Создает и возвращает анимированное изображение из существующего набора изображений.Все изображения, включенные в анимированное изображение, должны иметь одинаковый размер и масштаб.