ios - UIStackView إخفاء عرض الرسوم المتحركة




swift animation (4)

أرغب في مشاركة هذه الوظيفة UIStackView للاختباء وإظهار العديد من طرق العرض في UIStackView ، لأنه مع كل الكود الذي استخدمته من قبل لم يعمل بسلاسة لأن المرء يحتاج إلى إزالةAnimation من بعض الطبقات:

extension UIStackView {
    public func make(viewsHidden: [UIView], viewsVisible: [UIView], animated: Bool) {
        let viewsHidden = viewsHidden.filter({ $0.superview === self })
        let viewsVisible = viewsVisible.filter({ $0.superview === self })

        let blockToSetVisibility: ([UIView], _ hidden: Bool) -> Void = { views, hidden in
            views.forEach({ $0.isHidden = hidden })
        }

        // need for smooth animation
        let blockToSetAlphaForSubviewsOf: ([UIView], _ alpha: CGFloat) -> Void = { views, alpha in
            views.forEach({ view in
                view.subviews.forEach({ $0.alpha = alpha })
            })
        }

        if !animated {
            blockToSetVisibility(viewsHidden, true)
            blockToSetVisibility(viewsVisible, false)
            blockToSetAlphaForSubviewsOf(viewsHidden, 1)
            blockToSetAlphaForSubviewsOf(viewsVisible, 1)
        } else {
            // update hidden values of all views
            // without that animation doesn't go
            let allViews = viewsHidden + viewsVisible
            self.layer.removeAllAnimations()
            allViews.forEach { view in
                let oldHiddenValue = view.isHidden
                view.layer.removeAllAnimations()
                view.layer.isHidden = oldHiddenValue
            }

            UIView.animate(withDuration: 0.3,
                           delay: 0.0,
                           usingSpringWithDamping: 0.9,
                           initialSpringVelocity: 1,
                           options: [],
                           animations: {

                            blockToSetAlphaForSubviewsOf(viewsVisible, 1)
                            blockToSetAlphaForSubviewsOf(viewsHidden, 0)

                            blockToSetVisibility(viewsHidden, true)
                            blockToSetVisibility(viewsVisible, false)
                            self.layoutIfNeeded()
            },
                           completion: nil)
        }
    }
}

في نظام iOS 11 ، تم تغيير سلوك إخفاء الرسوم المتحركة داخل UIStackView ، لكن لم أتمكن من العثور على هذا المستند في أي مكان.

iOS 10

iOS 11

الكود في كليهما هو:

UIView.animate(withDuration: DiscoverHeaderView.animationDuration,
                       delay: 0.0,
                       usingSpringWithDamping: 0.9,
                       initialSpringVelocity: 1,
                       options: [],
                       animations: {
                            clear.isHidden = hideClear
                            useMyLocation.isHidden = hideLocation
                        },
                       completion: nil)

كيف يمكنني استعادة السلوك السابق على نظام التشغيل iOS 11؟


التمديد السريع 4:

// MARK: - Show hide animations in StackViews

extension UIView {

func hideAnimated(in stackView: UIStackView) {
    if !self.isHidden {
        UIView.animate(
            withDuration: 0.35,
            delay: 0,
            usingSpringWithDamping: 0.9,
            initialSpringVelocity: 1,
            options: [],
            animations: {
                self.isHidden = true
                stackView.layoutIfNeeded()
            },
            completion: nil
        )
    }
}

func showAnimated(in stackView: UIStackView) {
    if self.isHidden {
        UIView.animate(
            withDuration: 0.35,
            delay: 0,
            usingSpringWithDamping: 0.9,
            initialSpringVelocity: 1,
            options: [],
            animations: {
                self.isHidden = false
                stackView.layoutIfNeeded()
            },
            completion: nil
        )
    }
}
}

كان مجرد نفس المشكلة. يضيف الإصلاح stackView.layoutIfNeeded() داخل كتلة الرسوم المتحركة. حيث stackView هو حاوية العناصر التي تريد إخفاءها.

UIView.animate(withDuration: DiscoverHeaderView.animationDuration,
                   delay: 0.0,
                   usingSpringWithDamping: 0.9,
                   initialSpringVelocity: 1,
                   options: [],
                   animations: {
                        clear.isHidden = hideClear
                        useMyLocation.isHidden = hideLocation
                        stackView.layoutIfNeeded()
                    },
                   completion: nil)

لست متأكدًا من السبب في كونها مشكلة فجأة في نظام التشغيل iOS 11 ولكن لكي نكون منصفين ، فقد كانت دائمًا الطريقة الموصى بها.


التمديد لإخفاء / إظهار العناصر الفردية

إنه ليس مرتبطًا بنسبة 100٪ ، ولكن إذا كنت تبحث عن طريقة موجزة لإخفاء عناصر UIView الفردية (إما في عرض مكدس أو في أي مكان آخر) ، يمكنك استخدام هذا الملحق البسيط الذي أدليت به:

extension UIView {
    func isHiddenAnimated(value: Bool, duration: Double = 0.2) {
        UIView.animate(withDuration: duration) { [weak self] in self?.isHidden = value }
    }
}

يمكنني استخدامه لإخفاء / إظهار العناصر بشكل مريح مع الرسوم المتحركة في طريقة عرض مكدس مع سطر واحد من التعليمات البرمجية. مثال:

validatableButton.isHiddenAnimated(value: false)




uistackview