Saya belum pernah bekerja dengan batasan tata letak otomatis sebelumnya. Saya memiliki aplikasi kecil baru yang sedang saya kerjakan dan melihat bahwa tampilan NIB secara default menggunakan tata letak otomatis. Jadi, kupikir aku akan mengambil kesempatan untuk bekerja dengan itu dan mencoba untuk mencari tahu di mana Apple akan dengan ini.
Tantangan pertama:
Saya perlu mengubah ukuran MKMapView dan saya ingin menganimasikannya ke posisi baru. Jika saya melakukan ini dengan cara yang biasa saya lakukan:
[UIView animateWithDuration:1.2f
animations:^{
CGRect theFrame = worldView.frame;
CGRect newFrame = CGRectMake(theFrame.origin.x, theFrame.origin.y, theFrame.size.width, theFrame.size.height - 170);
worldView.frame = newFrame;
}];
... maka MKMapView akan 'kembali' ke ketinggian aslinya setiap kali tampilan saudara diperbarui (dalam kasus saya, judul UISegmentedControl sedang diperbarui [myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0]
).
Jadi, apa yang saya pikir saya ingin lakukan adalah mengubah kendala dari MKMapView dari yang sama dengan hight induk pandangan untuk menjadi relatif terhadap bagian atas UISegmentedControl bahwa itu meliputi:V:[MKMapView]-(16)-[UISegmentedControl]
Yang saya inginkan adalah tinggi MKMapView dipersingkat sehingga beberapa kontrol di bawah tampilan peta terungkap. Untuk melakukannya, saya pikir saya perlu mengubah batasan dari tampilan ukuran penuh tetap ke tampilan di mana bagian bawah dibatasi ke atas UISegmentedControl ... dan saya ingin itu dianimasikan saat tampilan menyusut ke ukuran baru.
Bagaimana seseorang melakukan ini?
Sunting - animasi ini tidak beranimasi meskipun bagian bawah tampilan naik langsung ke 170:
[UIView animateWithDuration:1.2f
animations:^{
self.nibMapViewConstraint.constant = -170;
}];
dan nibMapViewConstraint
disambungkan di IB ke batasan Ruang Vertikal bawah.
sumber
Jawaban:
Setelah memperbarui kendala Anda:
Ganti
self.view
dengan referensi ke tampilan yang memuat.sumber
UIViewAnimationOptionBeginFromCurrentState
batasan tata letak akan diatur SEBELUM animasi!layoutIfNeeded
setiap pandangan tersebut, cukup hubungi[[self.view superview] layoutIfNeeded];
UIViewAnimationOptionBeginFromCurrentState
.Ini berfungsi untuk saya (Baik iOS7 dan iOS8 +). Klik pada batasan tata letak otomatis yang ingin Anda sesuaikan (dalam pembuat antarmuka, mis. Batasan teratas). Selanjutnya jadikan ini IBOutlet;
Menganimasikan ke atas;
Animasikan kembali ke tempat semula
sumber
Ada tutorial yang sangat bagus dari apple itu sendiri yang menjelaskan bagaimana menggunakan animasi dengan autolayout. Ikuti link ini dan kemudian temukan video bernama "Auto layout by example" Ini memberikan beberapa hal menarik tentang autolayout dan bagian terakhir adalah tentang bagaimana menggunakan animasi.
sumber
Saya telah membuat demo kecil ini tersedia . Ini menunjukkan bagaimana batasan tata letak otomatis dapat diubah dan dianimasikan dalam contoh yang sangat sederhana. Cukup lihat DemoViewController.m .
sumber
Kebanyakan orang menggunakan autolayout untuk mengatur tata letak item pada tampilan mereka dan mengubah batasan tata letak untuk membuat animasi.
Cara mudah untuk melakukan ini tanpa banyak kode adalah membuat UIView yang ingin Anda animasikan di Storyboard, lalu membuat UIView tersembunyi di mana Anda ingin UIView diakhiri. Anda dapat menggunakan pratinjau di xcode untuk memastikan kedua UIViews berada di tempat yang Anda inginkan. Setelah itu, sembunyikan UIView penutup dan tukar batasan tata letak.
Ada podfile untuk menukar batasan tata letak yang disebut SBP jika Anda tidak ingin menulisnya sendiri.
Berikut tutorialnya .
sumber
Tidak perlu menggunakan lebih banyak
IBOutlet reference
batasan daripada ini, Anda bisa langsungaccess
atauupdate
sudah menerapkan batasan baik yang diterapkan olehProgrammatically
atau dariInterface Builder
tampilan mana pun menggunakanKVConstraintExtensionsMaster
pustaka. Perpustakaan ini juga mengelolaCumulative
perilakuNSLayoutConstraint
.Untuk menambahkan Batasan Ketinggian di containerView
Untuk memperbarui Batasan Ketinggian containerView dengan animasi
sumber