Snapkit: Tata letak dan animasi rusak

Dibuat pada 3 Okt 2016  ·  5Komentar  ·  Sumber: SnapKit/SnapKit

Daftar Periksa Masalah Baru

  • [X] Saya telah melihat Dokumentasi
  • [X] Saya telah membaca FAQ
  • [X] Saya telah mengisi template masalah ini.

    Info Masalah

| Info | Nilai |
| --- | --- |
| Platform | ios |
| Versi Platform | 10.0 |
| Versi SnapKit | 3.0.1 |
| Metode Integrasi | buah kakao |

Deskripsi masalah

| Versi SnapKit | Rusak |
| --- | --- |
| 0.22.0 | salah |
| 3.0.1 | benar |

  1. self(UIView) tidak menghormati sisi bawah subtitleLabel.
  2. Inset tidak berfungsi sama sekali
  3. Animasi rusak!

| lihat | bingkai |
| --- | --- |
| judulLabel | (15.0, 45.0, 345.0, 86.5) |
| subjudulLabel | (15.0, 65.0, 345.0, 18.0) |
| diri | (-187.5, -49.0, 375.0, 98.0) |

subtitleLabel.x harus 146,5 (20.0 + 5.0 + 20.0 + 86.5 + 15.0)
self.height harus 179.5 (146.5 + 18.0 + 15.0)
self.x harus -179.5
self.y harus -20

    func initialize() {
        self.snp.makeConstraints { (make) in
            let superview = self.superview!
            make.top.equalTo(superview.snp.top)
            make.left.equalTo(superview.snp.left)
            make.right.equalTo(superview.snp.right)
        }

        // Title Label
        let _titleLabel = UILabel(frame: CGRect.zero)
        _titleLabel.numberOfLines = 0
        _titleLabel.textColor = UIColor.white
        _titleLabel.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline)
        self.addSubview(_titleLabel)
        _titleLabel.snp.makeConstraints { (make) in
            let superview = _titleLabel.superview!
            make.top.equalTo(superview.snp.top).inset(statusBarHeight + 5 + 20)
            make.left.equalTo(superview.snp.left).inset(15)
            make.right.equalTo(superview.snp.right).inset(15)
        }
        titleLabel = _titleLabel

        // Subtitle Label
        let _subtitleLabel = UILabel(frame: CGRect.zero)
        _subtitleLabel.numberOfLines = 0
        _subtitleLabel.textColor = UIColor.white
        _subtitleLabel.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.subheadline)
        self.addSubview(_subtitleLabel)
        _subtitleLabel.snp.makeConstraints { (make) in
            let superview = _subtitleLabel.superview!
            make.top.equalTo(_titleLabel.snp.top).inset(20)
            make.left.equalTo(superview.snp.left).inset(15)
            make.right.equalTo(superview.snp.right).inset(15)
            make.bottom.equalTo(superview.snp.bottom).inset(15)
        }
        subtitleLabel = _subtitleLabel
    }

    func dismiss() {
        // Hide with animation
        UIView.animate(withDuration: 1.3, delay: 0.0, usingSpringWithDamping: 0.6, initialSpringVelocity: 1.0, options: [], animations: { [weak self] in
            guard let strongSelf = self else { return }
            strongSelf.snp.updateConstraints({ (make) in
                let superview = strongSelf.superview!
                make.top.equalTo(superview.snp.top).inset(-strongSelf.frame.height)
                strongSelf.layoutIfNeeded()
            })
        }, completion: { [weak self] (finished) in
            guard let strongSelf = self else { return }
            strongSelf.removeFromSuperview()
        })
    }

    func show() {        
        // Initial hidden
        self.snp.updateConstraints { (make) in
            let superview = self.superview!
            make.top.equalTo(superview.snp.top).inset(-self.frame.height)
            layoutIfNeeded()
            // Output
            print(self.titleLabel.frame)
            print(self.subtitleLabel.frame)
            print(self.frame)
        }

        // Show with animation
        UIView.animate(withDuration: 0.3, delay: 0.0, usingSpringWithDamping: 0.6, initialSpringVelocity: 1.0, options: [], animations: { [weak self] in
            guard let strongSelf = self else { return }
            strongSelf.snp.updateConstraints({ (make) in
                let superview = strongSelf.superview!
                make.top.equalTo(superview.snp.top).inset(-20)
                strongSelf.layoutIfNeeded()
            })
        }, completion: { [weak self] (finished) in
            // ...
        })

        // Dismiss after 2 seconds
        let delayTime = DispatchTime.now(withDelay: 2.0) // DispatchTime extension
        DispatchQueue.main.asyncAfter(deadline: delayTime) { [weak self] in
            guard let strongSelf = self else { return }
            strongSelf.dismiss()
        }
    }
need info

Komentar yang paling membantu

@cooler333 terkadang internal iOS sedikit berubah, sebagai aturan praktis Anda perlu memanggil layoutIfNeeded() pada superview umum terdekat dari dua tampilan batasan dari dan ke.

Jadi untuk self -> self.label Anda perlu memanggilnya di self.superview

Semua 5 komentar

@cooler333 dapatkah Anda mencoba menyederhanakan contoh Anda sedikit untuk mengonfirmasi ini?

Sesuatu seperti ini saat diberhentikan:

// Initial hidden
        self.snp.updateConstraints { (make) in
            let superview = self.superview!
            make.top.equalTo(superview.snp.top).offset(500)
        }
        UIView.animate(withDuration: 0.5) { self.layoutIfNeeded(); self.superview.layoutIfNeeded() }

Dan lihat apakah terjadi sesuatu? Sulit untuk mengikuti contoh kode yang begitu rumit tanpa sumber lengkap untuk mendiagnosis.

Tebakan pertama adalah Anda mungkin perlu memanggil self.superview.layoutIfNeeded() serta self.layoutIfNeeded() .

Juga jika Anda memanggil layoutIfNeeded() di dalam penutupan pembuat kendala SnapKit, UIKit belum akan memiliki batasan yang baru dibuat, Anda perlu memanggil layoutIfNeeded SETELAH penutupan pembuat batasan selesai.

        layoutIfNeeded()
        superview?.layoutIfNeeded()

Ini membantu! memperbaikinya.

tetapi di iOS 9 + Swift 2.3 memiliki perilaku yang berbeda. sangat aneh. Terima kasih!

@cooler333 terkadang internal iOS sedikit berubah, sebagai aturan praktis Anda perlu memanggil layoutIfNeeded() pada superview umum terdekat dari dua tampilan batasan dari dan ke.

Jadi untuk self -> self.label Anda perlu memanggilnya di self.superview

SnapKitIssueExample.zip

  • self(UIView) tidak menghormati sisi bawah subtitleLabel.
  • Inset tidak berfungsi sama sekali

Contoh proyek

baru-baru ini ditingkatkan ke SnapKit 3, menemukan updateConstraints tidak berfungsi secara konsisten: mirip dengan @cooler333 tampilkan/sembunyikan

Apakah halaman ini membantu?
0 / 5 - 0 peringkat