| Info | Nilai |
| --- | --- |
| Platform | ios |
| Versi Platform | 10.0 |
| Versi SnapKit | 3.0.1 |
| Metode Integrasi | buah kakao |
| Versi SnapKit | Rusak |
| --- | --- |
| 0.22.0 | salah |
| 3.0.1 | benar |
| 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()
}
}
@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
Contoh proyek
baru-baru ini ditingkatkan ke SnapKit 3, menemukan updateConstraints tidak berfungsi secara konsisten: mirip dengan @cooler333 tampilkan/sembunyikan
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 diself.superview