Bingkai, batas, pusat, asal-usul UIView, kapan harus menggunakan apa?

195

UIViewmemiliki sifat frame, bounds, center, dan origin, dan mereka semua tampaknya akan saling berkaitan. Sebagian besar waktu, saya berurusan dengan frameketika mengatur posisi dan ukuran a UIView. Saya mengerti bahwa framemenggunakan sistem koordinat global dan boundsmenggunakan koordinat tampilan lokal (oleh karena itu x dan y adalah 0, tetapi tidak selalu), tetapi masih membingungkan saya kapan harus menggunakan apa.

Di bawah konteks apa (dan apa waktu yang tepat) sifat-sifat lainnya ( bounds, center, origin) harus digunakan?

Anugerah
sumber
Tautan di bawah ini memiliki jawaban terbaik. stackoverflow.com/questions/5361369/…
Ohmy
Bingkai vs Batas dengan gambar: stackoverflow.com/a/28917673/3681880
Suragch

Jawaban:

240

Jawaban Marco di atas benar, tetapi hanya untuk memperluas pertanyaan "di bawah konteks apa" ...

bingkai - ini adalah properti yang paling sering Anda gunakan untuk aplikasi iPhone normal. sebagian besar kontrol akan diletakkan relatif terhadap kontrol "mengandung" sehingga frame.origin akan langsung sesuai dengan tempat kontrol perlu ditampilkan, dan ukuran frame.size akan menentukan seberapa besar untuk membuat kontrol.

center - ini adalah properti yang kemungkinan akan Anda fokuskan untuk permainan dan animasi berbasis sprite di mana gerakan atau penskalaan dapat terjadi. Secara default animasi dan rotasi akan didasarkan pada pusat UIView. Jarang masuk akal untuk mencoba dan mengelola objek seperti itu oleh properti bingkai.

bounds - properti ini bukan properti pemosisian, tetapi mendefinisikan area yang dapat digambar dari "relatif" UIView ke bingkai. Secara default, properti ini biasanya (0, 0, lebar , tinggi ). Mengubah properti ini akan memungkinkan Anda untuk menggambar di luar bingkai atau membatasi gambar ke area yang lebih kecil di dalam bingkai. Diskusi yang baik tentang ini dapat ditemukan di tautan di bawah ini. Jarang properti ini dimanipulasi kecuali ada kebutuhan khusus untuk menyesuaikan wilayah gambar. Satu-satunya pengecualian adalah bahwa sebagian besar program akan menggunakan [[UIScreen mainScreen] bounds]startup untuk menentukan area yang terlihat untuk aplikasi dan mengatur kerangka UIView awal mereka sesuai.

Mengapa ada bingkai persegi panjang dan persegi panjang batas dalam UIView?

Semoga ini membantu memperjelas keadaan di mana masing-masing properti bisa digunakan.

Barney Mattox
sumber
33
Saya pikir itu layak menambahkan bahwa boundsbiasanya digunakan ketika tampilan memiliki transformasi yang diterapkan padanya. Dalam keadaan ini, frameproperti tidak dapat ditentukan. Seperti yang ditunjukkan oleh jawaban lain, memodifikasi centerdan boundssetara dengan memodifikasi posisi dan ukuran tampilan masing-masing.
Stuart
36

Mereka adalah nilai terkait, dan tetap konsisten dengan metode setter / pengambil properti (dan menggunakan fakta bahwa frame adalah nilai murni yang disintesis, tidak didukung oleh variabel instance aktual).

Persamaan utama adalah:

frame.origin = center - bounds.size / 2

(yang sama dengan)

center = frame.origin + bounds.size / 2

(dan ada juga)

frame.size = bounds.size

Itu bukan kode, hanya persamaan untuk mengekspresikan invarian antara ketiga properti. Persamaan ini juga menganggap transformasi pandangan Anda adalah identitas, yang secara default. Jika tidak, maka batas dan tengah tetap memiliki makna yang sama, tetapi bingkai dapat berubah. Kecuali jika Anda melakukan rotasi non-sudut kanan, bingkai akan selalu menjadi tampilan yang ditransformasikan dalam hal koordinat superview.

Semua hal ini dijelaskan secara lebih rinci dengan perpustakaan mini yang bermanfaat di sini:

http://bynomial.com/blog/?p=24

Tyler
sumber
18

Properti center, boundsdan framesaling terkait: mengubah satu akan memperbarui yang lain, jadi gunakan sesuka Anda. Sebagai contoh, alih-alih memodifikasi x / y params frameuntuk membuka kembali tampilan, cukup perbarui centerproperti.

Marco Mustapic
sumber