Как исправить ошибку анимации при вызове несколько раз?IOS

Программируем под IOS
Ответить
Anonymous
 Как исправить ошибку анимации при вызове несколько раз?

Сообщение Anonymous »

Я использую этот код для создания адаптации. Когда я нажимаю кнопку, я перейду к следующему представлению. Моя проблема заключается в том, что 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»