Анимируйте переход UIView, добавив его в UIStackView - PullRequest
0 голосов
/ 28 июня 2019

У меня есть пользовательский объект, который является подклассом UIView.Мое желаемое поведение - чтобы этот объект изначально отображался в середине экрана.Затем, через 3 секунды, я хочу, чтобы объект (с плавной анимацией) перешел в горизонтальную UIStackView, в которой уже есть элемент, поэтому customObject в идеале переместился бы в правую половину stackView. * 1005.*

enter image description here

В настоящее время я не могу добиться этого поведения.

ViewController.swift :

class ViewController: UIViewController {

    let customObject = CustomObject(frame: .init(x: 0, 
                                                 y: 0, 
                                                 width: 200.0, 
                                                 height: 200.0))

    let stackView: UIStackView = {
        let sv = UIStackView()
        sv.axis = .horizontal
        return sv
    }() 

    override func viewDidLoad() {
        super.viewDidLoad()

        let label = UILabel()
        label.text = "first Element in horizontal stackView"
        stackView.addArrangedSubview(label)

        addCustomObjectToStackView()
    }

    func addCustomObjectToStackView() {

        stackView.addArrangedSubview(customObject)

        UIView.animate(withDuration: 1.0, animations: {
            customObject.layoutIfNeeded()
        })
    }
}

1 Ответ

0 голосов
/ 28 июня 2019

Поскольку UIStackView предназначен для организации своих подпредставлений, выполнение анимированного дополнения таким способом может быть сложным для выполнения.

Итак, один из вариантов:

  • Начните сочистите "holderView" в stackView
  • добавьте свой customObject к основному виду (теперь он является родственным элементом stackView)
  • анимируйте позицию и размер customObject для соответствияholderView
  • после завершения анимации, добавьте customObject в качестве подпредставления holderView

enter image description here

Вотпример кода для тестирования (примечание: просто демонстрационный код, не готовый к производству):

//
//  AnimToStackViewController.swift
//
//  Created by Don Mag on 6/28/19.
//

import UIKit

class CustomObject: UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)

        let theLabel = UILabel()
        theLabel.textAlignment = .center
        theLabel.text = "Custom Object"
        theLabel.translatesAutoresizingMaskIntoConstraints = false

        addSubview(theLabel)

        NSLayoutConstraint.activate([
            theLabel.centerXAnchor.constraint(equalTo: centerXAnchor),
            theLabel.centerYAnchor.constraint(equalTo: centerYAnchor),
            ])

        backgroundColor = .cyan
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

class AnimToStackViewController: UIViewController {

    let theStackView: UIStackView = {
        let v = UIStackView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.axis = .horizontal
        v.alignment = .fill
        v.distribution = .fill
        return v
    }()

    let theLabel: UILabel = {
        let v = UILabel()
        v.textAlignment = .center
        v.text = "This is the label in the stack view."
        v.numberOfLines = 0
        return v
    }()

    let holderView: UIView = {
        let v = UIView()
        v.translatesAutoresizingMaskIntoConstraints = false
        return v
    }()

    let customObject = CustomObject(frame: CGRect(x: 0, y: 0, width: 150, height: 150))

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(theStackView)

        theStackView.addArrangedSubview(theLabel)
        theStackView.addArrangedSubview(holderView)

        view.addSubview(customObject)

        NSLayoutConstraint.activate([
            theStackView.widthAnchor.constraint(equalToConstant: 300.0),
            theStackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 80.0),
            theStackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),

            holderView.widthAnchor.constraint(equalTo: customObject.widthAnchor, constant: 0.0),
            holderView.heightAnchor.constraint(equalTo: customObject.heightAnchor, constant: 0.0),
            ])

        customObject.center = view.center

    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        let pt = self.holderView.center
        let convertedPoint = self.theStackView.convert(pt, to: self.view)

        UIView.animate(withDuration: 1.0, delay: 3.0, options: [], animations: {
            self.customObject.center = convertedPoint
            self.view.layoutIfNeeded()
        }, completion: { (finished) in
            if finished {
                self.holderView.addSubview(self.customObject)
                self.customObject.frame = self.holderView.bounds
            }
        })

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...