Masker Autoresizing secara terprogram vs Interface Builder / xib / nib

216

Saya berada dalam asumsi (mungkin salah) bahwa mengaktifkan indikator margin kanan di xib setara dengan menggunakan UIViewAutoresizingFlexibleLeftMarginkode di dalam dan sebagainya.

Jadi, saya dulu berpikir sesuai dengan snapshot ini: masukkan deskripsi gambar di sini

Kemudian hari ini saya harus memeriksa silang, dan menemukan utas ini .

Dan juga dokumentasi apel, berhak dengan bagian dengan judul - "Menangani Perubahan Tata Letak Secara Otomatis Menggunakan Aturan Autoresizing" di tautan ini: https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/ CreatingViews.html

Jadi saya sekarang memiliki konsep baru dalam pikiran saya tentang bagaimana pengaturan masker autoresizing secara pemrograman akan setara dengan pengaturan xib:

Skenario 1 : Pengaturan hanya (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)setara dengan:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)

Dalam XIB?

Skenario 2 : Pengaturan (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)dalam kode sama dengan:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAlexizingBottiveFot

Dalam XIB?

Apakah 2 skenario saya yang diperbarui benar? Apakah saya sekarang dalam pemahaman saya?

Raj Pawan Gumdal
sumber
3
Anda bercanda? Tapi sepertinya juga ada kebingungan di mana. Jadi jika saya ingin memeluk bagian atas, saya mengaktifkan bagian bawah autoresize. Apel yang bagus. Ini adalah pengaturan paling konyol yang pernah saya lihat.
user4951
1
Jika Anda ingin memeluk bagian atas Anda harus memastikan bahwa Anda tidak akan menyebutkan UIViewAutoresizingFlexibleTopMargin dalam kode bit mask. Asumsi saya sebelumnya salah dan itulah mengapa saya memposting pertanyaan ini untuk menghapusnya.
Raj Pawan Gumdal
Asumsi Anda benar. Dimana kamu salah
user4951
Ya, dua skenario yang Anda kutip benar.
3
Saya membuat alat sederhana untuk ini: erkanyildiz.me/lab/autoresizingmask Anda dapat menggunakannya.
erkanyildiz

Jawaban:

35

Ya, Interface Builder membuatnya "terbalik" dalam arti tertentu (atau UIView, tergantung pada bagaimana Anda melihatnya). "Skenario" yang Anda kutip benar.

DarkDust
sumber
47

Ya, Anda telah mengutip dengan benar. Juga, saya setuju bahwa itu terasa agak mundur, jadi untuk alasan itu saya menghargai posting Anda.

Anda mungkin suka menggunakan preprocessor Macro UIViewAutoresizingFlexibleMarginssaat membuat margin UIView fleksibel di segala arah. Saya menempatkan ini di file header yang sudah dikompilasi sehingga disertakan di mana-mana.

#define UIViewAutoresizingFlexibleMargins                 \
              UIViewAutoresizingFlexibleBottomMargin    | \
              UIViewAutoresizingFlexibleLeftMargin      | \
              UIViewAutoresizingFlexibleRightMargin     | \
              UIViewAutoresizingFlexibleTopMargin

Menggunakan UIViewAutoresizingFlexibleMarginsakan membuat Elemen UI tetap terpusat karena TIDAK akan memeluk satu sisi. Untuk membuat elemen tumbuh / menyusut dengan induknya, atur UIViewAutoresizingFlexibleWidthdan UIViewAutoresizingFlexibleHeightmasing - masing.

Saya suka menggunakan UIViewAutoresizingFlexibleMarginskarena nanti saya dapat referensi seperti:

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;

dari pada

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;

Semua sering saya melihat margin ini ATAU bersama pada satu baris seperti contoh di atas. Sulit dibaca.

Sam
sumber
4
Harus fleksibel di segala arah (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight) Saya rasa? Atau apakah saya bingung lagi!
Raj Pawan Gumdal
4
FlexibleMargins akan membuat elemen tetap di tengah (tidak memeluk margin kiri, atas, kanan, atau bawah). Lebar / tinggi fleksibel akan membuat elemen ui tumbuh / menyusut masing-masing.
Sam
4
Apakah semuanya jelas sekarang? Juga, saya benar-benar bersungguh-sungguh ketika saya berkata saya menghargai posting Anda. Saya benar-benar disukai itu b / c ini telah membingungkan saya di masa lalu. Saya pikir ini adalah Q.
Sam
3
Ya, terima kasih, sekarang saya mengerti, "Batas fleksibel" dan "Lebar fleksibel / tinggi". Itu menjelaskan semuanya, dan "tidak memeluk margin kiri, atas, kanan, atau bawah" adalah cara yang baik untuk menjelaskan :)
Raj Pawan Gumdal
0

masukkan deskripsi gambar di sini

Mengaktifkan panah vertikal / horizontal (disebut pegas) di dalam kotak akan membuat ketinggian / lebar fleksibel. Tetapi mengaktifkan garis luar (disebut strut) akan membuat sisi itu tidak fleksibel / tidak fleksibel.

Mengaktifkan garis kiri luar (strut kiri) tidak setara dengan mengaktifkan UIViewAutoresizingFlexibleRightMargin. Sebaliknya, UIViewAutoresizingFlexibleRightMargin= aktif jika penyangga kanan dinonaktifkan, mati jika penyangga kanan diaktifkan.

Ini agak membingungkan pada awalnya, tetapi jika Anda melihat dari dekat, ada perbedaan dalam mata air dan penyangga. Saya tidak tahu mengapa Apple melakukan ini, tetapi bagi saya, ada beberapa kasus di mana lebih mudah digunakan. Dan menggunakan properti yang berlawanan dalam kode bahkan lebih membingungkan.

Abdurrahman Mubeen Ali
sumber
0

Swift 4 gunakan ini

gadBannerView?.autoresizingMask = [.flexibleRightMargin  , .flexibleLeftMargin , .flexibleTopMargin , .flexibleBottomMargin]

Objektif-C

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
Muhammad Nayab
sumber