Я использую этот код для создания адаптации. Когда я нажимаю кнопку, я перейду к следующему представлению. Моя проблема заключается в том, что Cloudsanimation () анимация не работает на 3 -м (последнем) экране, когда я использую этот код:
pageTransition(animated: true, direction: "fromRight")
< /code>
Но когда я использую этот код: < /p>
pageTransition(animated: false, direction: "fromRight")
< /code>
Все работает нормально. Как это исправить?
data:
{
"onboardingsData" : [
{
"textData" : "1",
"backgroundImage" : "onboarding1-1",
"animationImage" : "onboarding1-2",
"animationState" : "true",
},
{
"textData" : "2",
"backgroundImage" : "onboarding2-1",
"animationImage" : "onboarding2-2",
"animationState" : "false",
},
{
"textData" : "3",
"backgroundImage" : "",
"animationImage" : "onboarding3-1",
"animationState" : "true",
},
]
}
code:
onationingController
struct OnboardingsData: Decodable {
var onboardingsData: [OnboardingData]
}
struct OnboardingData: Decodable {
let textData, backgroundImage, animationImage, animationState: String
}
class OnboardingController: UIViewController {
var pagesData = [OnboardingData]()
var pageIndex: Int = -1
let pageContainer: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
let pageViews: [SomeView] = {
let view = [SomeView(), SomeView()]
view[0].translatesAutoresizingMaskIntoConstraints = false
view[1].translatesAutoresizingMaskIntoConstraints = false
return view
}()
lazy var pageControl: UIPageControl = {
let view = UIPageControl()
view.numberOfPages = 3
view.currentPage = 0
view.pageIndicatorTintColor = .black
view.currentPageIndicatorTintColor = .yellow
view.isUserInteractionEnabled = false
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
lazy var button: UIButton = {
let button = UIButton()
button.setTitle("Go", for: .normal)
button.titleLabel?.font = .systemFont(ofSize: 20)
button.addTarget(self, action: #selector(self.buttonAction), for: .touchUpInside)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
private var isAnimatedPage = false
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
setupConstraints()
pageTransition(animated: false, direction: "fromRight")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if !isAnimatedPage {
isAnimatedPage = true
pageViews[0].setupConstraints()
pageViews[1].setupConstraints()
}
}
func setupViews() {
button.configuration?.contentInsets = NSDirectionalEdgeInsets(top: 12, leading: 32, bottom: 10, trailing: 32)
pageContainer.addSubview(pageViews[0])
pageContainer.addSubview(pageViews[1])
view.addSubview(pageContainer)
view.addSubview(pageControl)
view.addSubview(button)
}
func setupConstraints() {
pageContainer.topAnchor.constraint(equalTo: view.topAnchor, constant: 0.0).isActive = true
pageContainer.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0.0).isActive = true
pageContainer.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0.0).isActive = true
pageContainer.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0.0).isActive = true
pageViews[0].topAnchor.constraint(equalTo: pageContainer.topAnchor).isActive = true
pageViews[0].bottomAnchor.constraint(equalTo: pageContainer.bottomAnchor).isActive = true
pageViews[0].leadingAnchor.constraint(equalTo: pageContainer.leadingAnchor).isActive = true
pageViews[0].trailingAnchor.constraint(equalTo: pageContainer.trailingAnchor).isActive = true
pageViews[1].topAnchor.constraint(equalTo: pageContainer.topAnchor).isActive = true
pageViews[1].bottomAnchor.constraint(equalTo: pageContainer.bottomAnchor).isActive = true
pageViews[1].leadingAnchor.constraint(equalTo: pageContainer.leadingAnchor).isActive = true
pageViews[1].trailingAnchor.constraint(equalTo: pageContainer.trailingAnchor).isActive = true
pageControl.heightAnchor.constraint(equalToConstant: 8).isActive = true
pageControl.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -32).isActive = true
pageControl.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
pageControl.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
button.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -32).isActive = true
button.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -32).isActive = true
}
func loadData(fileName: Any) -> OnboardingsData {
var url = NSURL()
url = Bundle.main.url(forResource: "onboardingData", withExtension: "json")! as NSURL
let data = try! Data(contentsOf: url as URL)
let person = try! JSONDecoder().decode(OnboardingsData.self, from: data)
return person
}
func pageTransition(animated: Bool, direction: String) {
let result = loadData(fileName: pagesData)
switch direction {
case "fromRight":
pageIndex += 1
case "fromLeft":
pageIndex -= 1
default: break
}
if pageIndex = result.onboardingsData.count {
} else {
let fromView = pageViews[0].isHidden ? pageViews[1] : pageViews[0]
let toView = pageViews[0].isHidden ? pageViews[0] : pageViews[1]
toView.configureOnboarding(theData: result.onboardingsData[pageIndex])
if animated {
toView.isHidden = false
let animation = CATransition()
animation.duration = 0
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
animation.isRemovedOnCompletion = true
animation.subtype = direction
let tapAnimationType = "fade"
switch tapAnimationType {
case "pageCurl": animation.type = "pageCurl"
case "fade": animation.type = "fade"
case "moveIn": animation.type = "moveIn"
case "push": animation.type = "push"
case "reveal": animation.type = "reveal"
default: animation.type = "fade" }
self.pageContainer.layer.add(animation, forKey: "pageAnimation")
self.pageContainer.bringSubview(toFront: toView)
fromView.isHidden = true
} else {
fromView.isHidden = true
toView.isHidden = false
}
}
}
@objc func buttonAction(_ sender: UIButton) {
pageTransition(animated: true, direction: "fromRight")
pageControl.currentPage += 1
}
}
< /code>
someview < /p>
class SomeView: UIView {
private let backgroundImageView: UIImageView = {
let image = UIImageView()
image.contentMode = .scaleAspectFill
image.translatesAutoresizingMaskIntoConstraints = false
return image
}()
private let animationImageView: UIImageView = {
let image = UIImageView()
image.contentMode = .scaleAspectFill
image.translatesAutoresizingMaskIntoConstraints = false
return image
}()
private let textLabel: UILabel = {
let label = UILabel()
label.font = .systemFont(ofSize: 20)
label.textColor = .white
label.textAlignment = .left
label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
label.layer.shadowColor = UIColor.black.cgColor
label.layer.shadowOffset = CGSize.zero
label.layer.shadowOpacity = 1.0
label.layer.shadowRadius = 4
return label
}()
var animationState = String()
let animationContainerView = UIView()
private let imageView1: UIImageView = {
let image = UIImageView()
return image
}()
private let imageView2: UIImageView = {
let image = UIImageView()
return image
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupViews()
}
required init?(coder: NSCoder) {
fatalError("error")
}
func setupViews() {
addSubview(backgroundImageView)
addSubview(animationImageView)
addSubview(textLabel)
}
func setupConstraints() {
textLabel.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -32).isActive = true
textLabel.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
textLabel.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
backgroundImageView.topAnchor.constraint(equalTo: topAnchor).isActive = true
backgroundImageView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
backgroundImageView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
backgroundImageView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
animationImageView.topAnchor.constraint(equalTo: topAnchor).isActive = true
animationImageView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
animationImageView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
animationImageView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
}
func configureOnboarding(theData: OnboardingData) {
textLabel.text = theData.textData
backgroundImageView.image = UIImage(named: theData.backgroundImage)
animationImageView.image = UIImage(named: theData.animationImage)
animationState = theData.animationState
cloudsAnimation()
setupConstraints()
}
func cloudsAnimation() {
layer.removeAllAnimations()
animationContainerView.removeFromSuperview()
imageView1.image = animationImageView.image
imageView2.image = animationImageView.image
imageView1.frame = .init(x: 0.0, y: 0.0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
imageView2.frame = .init(x: UIScreen.main.bounds.width, y: 0.0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
animationContainerView.addSubview(imageView1)
animationContainerView.addSubview(imageView2)
animationContainerView.frame = .init(x: 0.0, y: 0.0, width: UIScreen.main.bounds.width * 2.0, height: UIScreen.main.bounds.height)
addSubview(animationContainerView)
animationContainerView.isUserInteractionEnabled = false
self.animationContainerView.frame.origin.x = 0
if animationState == "true" {
UIView.animate(withDuration: 200.0, delay: 0.0, options: [.repeat, .curveLinear], animations: { [weak self] in
guard let self else { return }
self.animationContainerView.frame.origin.x = -UIScreen.main.bounds.width
})
} else {
self.animationContainerView.frame.origin.x = 0
}
}
}
< /code>
scenedelegate < /p>
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if let windowScene = (scene as? UIWindowScene) {
let viewController = OnboardingController()
let window = UIWindow(windowScene: windowScene)
window.rootViewController = viewController
self.window = window
window.makeKeyAndVisible()
}
}
}
< /code>
endension < /p>
extension Bundle {
func decode(_ type: T.Type, from file: String) -> T {
guard let url = self.url(forResource: file, withExtension: nil) else {
fatalError("Failed to locate \(file) in bundle.")
}
guard let data = try? Data(contentsOf: url) else {
fatalError("Failed to load \(file) from bundle.")
}
let decoder = JSONDecoder()
guard let loaded = try? decoder.decode(T.self, from: data) else {
fatalError("Failed to decode \(file) from bundle.")
}
return loaded
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... iple-times
Как исправить ошибку анимации при вызове несколько раз? ⇐ IOS
Программируем под IOS
-
Anonymous
1738088686
Anonymous
Я использую этот код для создания адаптации. Когда я нажимаю кнопку, я перейду к следующему представлению. Моя проблема заключается в том, что Cloudsanimation () анимация не работает на 3 -м (последнем) экране, когда я использую этот код:
pageTransition(animated: true, direction: "fromRight")
< /code>
Но когда я использую этот код: < /p>
pageTransition(animated: false, direction: "fromRight")
< /code>
Все работает нормально. Как это исправить?
[b] data: [/b]
{
"onboardingsData" : [
{
"textData" : "1",
"backgroundImage" : "onboarding1-1",
"animationImage" : "onboarding1-2",
"animationState" : "true",
},
{
"textData" : "2",
"backgroundImage" : "onboarding2-1",
"animationImage" : "onboarding2-2",
"animationState" : "false",
},
{
"textData" : "3",
"backgroundImage" : "",
"animationImage" : "onboarding3-1",
"animationState" : "true",
},
]
}
[b] code: [/b]
onationingController
struct OnboardingsData: Decodable {
var onboardingsData: [OnboardingData]
}
struct OnboardingData: Decodable {
let textData, backgroundImage, animationImage, animationState: String
}
class OnboardingController: UIViewController {
var pagesData = [OnboardingData]()
var pageIndex: Int = -1
let pageContainer: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
let pageViews: [SomeView] = {
let view = [SomeView(), SomeView()]
view[0].translatesAutoresizingMaskIntoConstraints = false
view[1].translatesAutoresizingMaskIntoConstraints = false
return view
}()
lazy var pageControl: UIPageControl = {
let view = UIPageControl()
view.numberOfPages = 3
view.currentPage = 0
view.pageIndicatorTintColor = .black
view.currentPageIndicatorTintColor = .yellow
view.isUserInteractionEnabled = false
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
lazy var button: UIButton = {
let button = UIButton()
button.setTitle("Go", for: .normal)
button.titleLabel?.font = .systemFont(ofSize: 20)
button.addTarget(self, action: #selector(self.buttonAction), for: .touchUpInside)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
private var isAnimatedPage = false
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
setupConstraints()
pageTransition(animated: false, direction: "fromRight")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if !isAnimatedPage {
isAnimatedPage = true
pageViews[0].setupConstraints()
pageViews[1].setupConstraints()
}
}
func setupViews() {
button.configuration?.contentInsets = NSDirectionalEdgeInsets(top: 12, leading: 32, bottom: 10, trailing: 32)
pageContainer.addSubview(pageViews[0])
pageContainer.addSubview(pageViews[1])
view.addSubview(pageContainer)
view.addSubview(pageControl)
view.addSubview(button)
}
func setupConstraints() {
pageContainer.topAnchor.constraint(equalTo: view.topAnchor, constant: 0.0).isActive = true
pageContainer.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0.0).isActive = true
pageContainer.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0.0).isActive = true
pageContainer.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0.0).isActive = true
pageViews[0].topAnchor.constraint(equalTo: pageContainer.topAnchor).isActive = true
pageViews[0].bottomAnchor.constraint(equalTo: pageContainer.bottomAnchor).isActive = true
pageViews[0].leadingAnchor.constraint(equalTo: pageContainer.leadingAnchor).isActive = true
pageViews[0].trailingAnchor.constraint(equalTo: pageContainer.trailingAnchor).isActive = true
pageViews[1].topAnchor.constraint(equalTo: pageContainer.topAnchor).isActive = true
pageViews[1].bottomAnchor.constraint(equalTo: pageContainer.bottomAnchor).isActive = true
pageViews[1].leadingAnchor.constraint(equalTo: pageContainer.leadingAnchor).isActive = true
pageViews[1].trailingAnchor.constraint(equalTo: pageContainer.trailingAnchor).isActive = true
pageControl.heightAnchor.constraint(equalToConstant: 8).isActive = true
pageControl.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -32).isActive = true
pageControl.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
pageControl.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
button.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -32).isActive = true
button.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -32).isActive = true
}
func loadData(fileName: Any) -> OnboardingsData {
var url = NSURL()
url = Bundle.main.url(forResource: "onboardingData", withExtension: "json")! as NSURL
let data = try! Data(contentsOf: url as URL)
let person = try! JSONDecoder().decode(OnboardingsData.self, from: data)
return person
}
func pageTransition(animated: Bool, direction: String) {
let result = loadData(fileName: pagesData)
switch direction {
case "fromRight":
pageIndex += 1
case "fromLeft":
pageIndex -= 1
default: break
}
if pageIndex = result.onboardingsData.count {
} else {
let fromView = pageViews[0].isHidden ? pageViews[1] : pageViews[0]
let toView = pageViews[0].isHidden ? pageViews[0] : pageViews[1]
toView.configureOnboarding(theData: result.onboardingsData[pageIndex])
if animated {
toView.isHidden = false
let animation = CATransition()
animation.duration = 0
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
animation.isRemovedOnCompletion = true
animation.subtype = direction
let tapAnimationType = "fade"
switch tapAnimationType {
case "pageCurl": animation.type = "pageCurl"
case "fade": animation.type = "fade"
case "moveIn": animation.type = "moveIn"
case "push": animation.type = "push"
case "reveal": animation.type = "reveal"
default: animation.type = "fade" }
self.pageContainer.layer.add(animation, forKey: "pageAnimation")
self.pageContainer.bringSubview(toFront: toView)
fromView.isHidden = true
} else {
fromView.isHidden = true
toView.isHidden = false
}
}
}
@objc func buttonAction(_ sender: UIButton) {
pageTransition(animated: true, direction: "fromRight")
pageControl.currentPage += 1
}
}
< /code>
someview < /p>
class SomeView: UIView {
private let backgroundImageView: UIImageView = {
let image = UIImageView()
image.contentMode = .scaleAspectFill
image.translatesAutoresizingMaskIntoConstraints = false
return image
}()
private let animationImageView: UIImageView = {
let image = UIImageView()
image.contentMode = .scaleAspectFill
image.translatesAutoresizingMaskIntoConstraints = false
return image
}()
private let textLabel: UILabel = {
let label = UILabel()
label.font = .systemFont(ofSize: 20)
label.textColor = .white
label.textAlignment = .left
label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
label.layer.shadowColor = UIColor.black.cgColor
label.layer.shadowOffset = CGSize.zero
label.layer.shadowOpacity = 1.0
label.layer.shadowRadius = 4
return label
}()
var animationState = String()
let animationContainerView = UIView()
private let imageView1: UIImageView = {
let image = UIImageView()
return image
}()
private let imageView2: UIImageView = {
let image = UIImageView()
return image
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupViews()
}
required init?(coder: NSCoder) {
fatalError("error")
}
func setupViews() {
addSubview(backgroundImageView)
addSubview(animationImageView)
addSubview(textLabel)
}
func setupConstraints() {
textLabel.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -32).isActive = true
textLabel.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
textLabel.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
backgroundImageView.topAnchor.constraint(equalTo: topAnchor).isActive = true
backgroundImageView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
backgroundImageView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
backgroundImageView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
animationImageView.topAnchor.constraint(equalTo: topAnchor).isActive = true
animationImageView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
animationImageView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
animationImageView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
}
func configureOnboarding(theData: OnboardingData) {
textLabel.text = theData.textData
backgroundImageView.image = UIImage(named: theData.backgroundImage)
animationImageView.image = UIImage(named: theData.animationImage)
animationState = theData.animationState
cloudsAnimation()
setupConstraints()
}
func cloudsAnimation() {
layer.removeAllAnimations()
animationContainerView.removeFromSuperview()
imageView1.image = animationImageView.image
imageView2.image = animationImageView.image
imageView1.frame = .init(x: 0.0, y: 0.0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
imageView2.frame = .init(x: UIScreen.main.bounds.width, y: 0.0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
animationContainerView.addSubview(imageView1)
animationContainerView.addSubview(imageView2)
animationContainerView.frame = .init(x: 0.0, y: 0.0, width: UIScreen.main.bounds.width * 2.0, height: UIScreen.main.bounds.height)
addSubview(animationContainerView)
animationContainerView.isUserInteractionEnabled = false
self.animationContainerView.frame.origin.x = 0
if animationState == "true" {
UIView.animate(withDuration: 200.0, delay: 0.0, options: [.repeat, .curveLinear], animations: { [weak self] in
guard let self else { return }
self.animationContainerView.frame.origin.x = -UIScreen.main.bounds.width
})
} else {
self.animationContainerView.frame.origin.x = 0
}
}
}
< /code>
scenedelegate < /p>
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if let windowScene = (scene as? UIWindowScene) {
let viewController = OnboardingController()
let window = UIWindow(windowScene: windowScene)
window.rootViewController = viewController
self.window = window
window.makeKeyAndVisible()
}
}
}
< /code>
endension < /p>
extension Bundle {
func decode(_ type: T.Type, from file: String) -> T {
guard let url = self.url(forResource: file, withExtension: nil) else {
fatalError("Failed to locate \(file) in bundle.")
}
guard let data = try? Data(contentsOf: url) else {
fatalError("Failed to load \(file) from bundle.")
}
let decoder = JSONDecoder()
guard let loaded = try? decoder.decode(T.self, from: data) else {
fatalError("Failed to decode \(file) from bundle.")
}
return loaded
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79393083/how-to-fix-animation-error-when-called-multiple-times[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия