Apa itu "Batasi ke margin" di Storyboard di Xcode 6

249

Saya Bekerja dengan autolayout dan kendala dan menemukan ada Constrain to marginsopsi di Xcode 6 yang tidak ada di Xcode 5 dan diperiksa secara default.

Saya membuat proyek uji kemudian saya menambahkan UITableViewpada ViewController dengan bingkai diatur ke ukuran yang sama dengan tampilan dan menambahkan kendala

Xcode 6 Anda dapat melihat di sini meskipun tableview memiliki bingkai yang sama dengan tampilan Xcode menyarankan untuk menambahkan -16 sebagai kendala sedangkan Xcode 5 akan menyarankan menambahkan spasi 0.

Dengan Batasi ke margin diperiksa

Sekarang ketika Anda hapus centang opsi "Batasi ke margin" itu berperilaku sama dengan Xcode 5 dan akan menyarankan menambahkan 0 sebagai kendala

Dengan Batasi ke margin Tidak Terkendali

Juga, saya menemukan bahwa setelah saya menambahkan batasan dengan Batasan ke margin diperiksa, saya tidak lagi dapat membuka file storyboard di Xcode 5 jadi itu pasti sesuatu yang baru di Xcode 6

Semoga saya bisa menjelaskan pertanyaan saya dengan benar. Saya ingin memahami apa yang sebenarnya "Kendala terhadap margin" dan kapan saya harus dan tidak boleh menggunakannya. Saya minta maaf jika itu sesuatu yang sangat sederhana dan jelas.

EDIT

Saya menemukan sesuatu tentang margin tata letak dalam diskusi di sini , saya ingin tahu apakah ini terkait dengan ini.

Bhumit Mehta
sumber
15
Tidak perlu meminta maaf - tidak jelas apa yang dilakukannya.
Ben Clayton
4
+1 tidak perlu meminta maaf, saya ingin menanyakan pertanyaan ini juga. BTW: untuk membuka storyboard di Xcode5 lihat: stackoverflow.com/a/25298909/529243
Olaf
1
Ini adalah hal yang paling dekat dengan penjelasan yang saya temukan: stackoverflow.com/questions/25275901/…
Nathaniel
Bagaimana cara menonaktifkan ini?
orkenstein
2
Ya itulah rasa sakit yang sebenarnya. Saya belum bisa mengetahuinya, cara menghapus centangnya secara permanen.
Bhumit Mehta

Jawaban:

315

Saya sama sekali tidak mengerti mengapa orang mengeluh bahwa " Margin akan menyebabkan crash langsung pada apa pun sebelum iOS 8. "

Mengatur kendala Anda relatif terhadap margin dalam file xib atau storyboard TIDAK membuat aplikasi Anda rusak di iOS7, dan itu TIDAK membuat perbedaan UI pada perangkat iOS7 Anda, selama Anda tidak menyentuh UIView.layoutMarginsdan UIView.preservesSuperviewLayoutMarginsproperti dalam kode Anda.

Apa itu Margin di iOS8

Margin tata letak mewakili bantalan di sekitar bagian dalam UIViewyang dapat digunakan sistem tata letak saat meletakkan subview - untuk memastikan bahwa ada celah yang tersisa antara tepi tampilan dan subview. Dalam hal ini sangat mirip dengan properti padding yang terkait dengan blok di CSS.

masukkan deskripsi gambar di sini

Secara default, UIViewtata letak memiliki margin 8 poin di setiap sisi, dan ini tidak dapat diubah Interface Builder . Namun, dengan menyetel UIView.layoutMarginsproperti dalam kode, yang hanya tersedia di iOS8, Anda dapat menyesuaikan nilai-nilai ini.

Anda bisa meminta IB untuk menampilkan margin Editor> Canvas> Show Layout Rectangles: masukkan deskripsi gambar di sini

Margin dapat digunakan untuk membantu mengatur tampilan dan subview Anda. Setiap UIViewdatang dengan margin secara default, tetapi mereka hanya mempengaruhi penempatan tampilan ketika Anda menetapkan batasan yang terkait dengan margin.

Cara menggunakan Margin

Satu-satunya cara untuk menggunakan margin di Interface Builder adalah dengan memeriksa opsi Relative to margin sambil mengkonfigurasi kendala Anda. Ini adalah bagaimana Anda mengarahkan kendala Anda untuk Menggunakan margin, bukan tepi saat meletakkan pandangan saya.

masukkan deskripsi gambar di sini

Mari kita lihat empat cara berbeda untuk menetapkan batasan utama antara tampilan dan subview-nya. Untuk setiap kendala yang kami ulas, asosiasi pertama yang dijelaskan akan memimpin subview , dan yang kedua akan memimpin superview . Yang ingin Anda perhatikan dengan cermat adalah status cek dan hapus centang dari Relatif terhadap margin dari setiap akhir kendala, karena itu menentukan apakah kendala terkait dengan margin atau tepi tampilan.

  1. Item pertama (hapus centang), item kedua (centang): Dalam hal ini, kami menyatakan bahwa tepi kiri subview harus sejajar dengan margin kiri superview (seperti yang ditunjukkan pada gambar ini).

masukkan deskripsi gambar di sini

  1. Item pertama (hapus centang), item kedua (hapus centang): Keduanya menggunakan edge, bukan margin . Dalam hal ini, kami menyatakan bahwa tepi kiri subview harus sejajar dengan tepi kiri superview.

masukkan deskripsi gambar di sini

  1. Item pertama (centang), item kedua (hapus centang): Dalam hal ini, kami menyatakan bahwa margin kiri subview harus sejajar dengan tepi kiri superview. Layout semacam ini sebenarnya membuat subview tumpang tindih dengan superview.

masukkan deskripsi gambar di sini

  1. Item pertama (centang), item kedua (centang). Ini sebenarnya memiliki efek yang sama dengan kasus 2, karena baik subview dan superview memiliki margin default yang sama. Kami menyatakan bahwa margin kiri subview harus sejajar dengan margin kiri superview.

masukkan deskripsi gambar di sini

Apa yang baik tentang Margin

Fitur baru ini (iOS8) hanya berdampak pada pengembangan UI jika Anda memutuskan untuk menggunakan margin.

Dengan menggunakan margin, Anda dapat menyesuaikan penempatan beberapa tayangan ganda yang berbagi hubungan umum ke superview bersama dengan mengubah nilai satu properti. Ini adalah kemenangan yang jelas atas pengaturan semua kendala terkait dengan nilai-nilai tetap, karena jika Anda perlu memperbarui semua spasi, alih-alih mengubah setiap nilai satu per satu, Anda dapat secara bersamaan memodifikasi semua penempatan yang relevan dengan memperbarui margin superview dengan satu baris tunggal kode seperti ini:

self.rootView.layoutMargins = UIEdgeInsetsMake(0, 50, 0, 0);

Untuk mengilustrasikan manfaat ini, dalam kasus berikut semua tepi kiri subview disejajarkan dengan margin kiri superview mereka. Dengan demikian, mengubah margin kiri superview akan memengaruhi semua subview secara bersamaan.

masukkan deskripsi gambar di sini

Scott Zhu
sumber
Terima kasih untuk penjelasan rinci. Saya menandai ini sebagai jawaban yang diterima karena ini menjelaskan semuanya dengan baik.
Bhumit Mehta
Terima kasih @ Bangkok, semoga jawaban ini membantu.
Scott Zhu
4
"Saya tidak mengerti sama sekali mengapa orang mengeluh". Yah, mungkin perilakunya berubah dengan salah satu beta terakhir, saya belum memeriksa. Tetapi setidaknya beberapa bulan yang lalu, itu menyebabkan crash bahkan jika Anda tidak mencoba mengatur layoutMargins dalam kode.
KPM
Layak untuk menunjukkan bahwa ketika menambahkan kendala baru, versi Xcode yang lebih baru memungkinkan Anda untuk menghapus centang pada kotak untuk "Batasi ke Margin" yang menetapkan bendera "Relatif ke Margin" yang sama. Ini berguna karena menghemat beberapa klik! Jawaban bagus BTW, dijelaskan dengan sangat baik dan gambarnya sangat membantu.
EricWasTaken
Saya mencatat bahwa foto-foto tersebut dihosting di dropbox. Bukankah lebih baik meng-host gambar pada SO?
pengujian
63

Di iOS 8 Anda sekarang memiliki opsi untuk menentukan batasan Anda relatif terhadap margin yang telah ditentukan untuk batas superview, bukan batas superview itu sendiri. Ya, ini benar-benar terkait dengan margin tata letak yang Anda tunjukkan dalam dokumen. Salah satu keuntungannya adalah Anda dapat mendefinisikan ulang margin Anda secara dinamis, atau berbeda untuk setiap jenis perangkat, dan tata letak akan diperbarui secara bersamaan tanpa mengubah kendala.

Kapan menggunakannya: kapan Anda ingin memanfaatkan fleksibilitas baru ini.

Kapan TIDAK menggunakannya: untuk aplikasi apa pun yang ditargetkan untuk berjalan di iOS 7 atau di bawah.

KPM
sumber
21
Ini akan menjadi fitur yang bagus jika tidak diaktifkan secara default dan menyebabkan crash langsung pada apa pun sebelum iOS 8.
TylerJames
1
Sangat setuju.
KPM
42

Properti di UIView adalah: layoutMargins. Lihat Apple Documents . Pada dasarnya jika margin tata letak adalah 8,8,8,8 (default), batasan dengan 0 margin ruang menuju wadah akan memiliki posisi x 8. Perhatikan bahwa ini hanya tersedia di iOS8 atau lebih baru.

Untuk semua orang yang tidak ingin batasannya masuk ke margin kontainer:

CTRL + klik + seret untuk menampilkan munculan penciptaan kendala.

Jika menu menunjukkan untuk membuat batasan pada margin secara default, tahan opsi / alt untuk memungkinkan batasan dibuat pada kontainer dan bukan pada margin kontainer.

Sekarang akan muncul opsi untuk membuat batasan TIDAK ke margin. Ini CARA lebih cepat dalam penggunaan saya.

Kyle Robson
sumber
3
Ini mungkin solusi terbaik yang saya temukan di sana. Menghapus centang "constain to margin" tidak selalu berhasil dan terasa sedikit terlalu ajaib. Ini sempurna.
Levi McCallum
Kenapa sih standarnya bukan 10pt?
ZaBlanc
11
Apple memiliki sejarah memilih panjang dan ukuran berdasarkan pada penelitian kegunaan, bukan dengan memilih angka yang lebih disukai yang membaca kode. Misalnya tinggi standar untuk banyak hal adalah 44 atau 35 pt. @ZaBlanc
Kyle Robson
Solusi sempurna ketika saya menambahkan kendala pada storyboard tanpa margin secara default. Terima kasih!
inix