Saya ingin tahu cara menggunakan properti ini dengan cara yang benar.
Seperti yang saya mengerti, frame
dapat digunakan dari wadah tampilan yang saya buat. Ini mengatur posisi tampilan relatif terhadap tampilan wadah. Ini juga mengatur ukuran tampilan itu.
Juga center
dapat digunakan dari wadah tampilan yang saya buat. Properti ini mengubah posisi tampilan relatif terhadap wadahnya.
Akhirnya, bounds
relatif terhadap pandangan itu sendiri. Ini mengubah area yang dapat digambar untuk tampilan.
Bisakah Anda memberikan info lebih lanjut tentang hubungan antara frame
dan bounds
? Bagaimana dengan clipsToBounds
dan masksToBounds
propertinya?
Jawaban:
Karena pertanyaan yang saya ajukan telah dilihat berulang kali, saya akan memberikan jawaban terperinci. Jangan ragu untuk memodifikasinya jika Anda ingin menambahkan lebih banyak konten yang benar.
Pertama rekap pada pertanyaan: bingkai, batas dan pusat dan hubungan mereka.
Frame A view's
frame
(CGRect
) adalah posisi persegi panjangnya disuperview
sistem koordinat. Secara default dimulai di kiri atas.Bounds A view's
bounds
(CGRect
) mengekspresikan persegi panjang view dalam sistem koordinatnya sendiri.Pusat A
center
adalahCGPoint
dinyatakan dalamsuperview
sistem koordinat dan menentukan posisi titik tengah tampilan yang tepat.Diambil dari posisi UIView + ini adalah hubungan (mereka tidak bekerja dalam kode karena mereka adalah persamaan informal) di antara properti sebelumnya:
frame.origin = center - (bounds.size / 2.0)
center = frame.origin + (bounds.size / 2.0)
frame.size = bounds.size
CATATAN: Hubungan ini tidak berlaku jika tampilan diputar. Untuk info lebih lanjut, saya sarankan Anda melihat gambar berikut yang diambil dari The Kitchen Drawer berdasarkan kursus Stanford CS193p . Kredit diberikan ke @Rhubarb .
Dengan menggunakan,
frame
Anda dapat mengubah posisi dan / atau mengubah ukuran tampilan di dalamnyasuperview
. Biasanya dapat digunakan darisuperview
, misalnya, saat Anda membuat subview tertentu. Sebagai contoh:Ketika Anda membutuhkan koordinat untuk menggambar di dalam,
view
Anda biasanya merujukbounds
. Contoh tipikalnya adalah menggambar dalamview
subview sebagai inset yang pertama. Menggambar subview perlu mengetahuibounds
superview. Sebagai contoh:Perilaku yang berbeda terjadi ketika Anda mengubah
bounds
tampilan. Misalnya, jika Anda mengubahbounds
size
,frame
perubahan (dan sebaliknya). Perubahan terjadi di sekitarcenter
tampilan. Gunakan kode di bawah ini dan lihat apa yang terjadi:Selanjutnya, jika Anda mengubah
bounds
origin
Anda mengubahorigin
sistem koordinat internal. Secara defaultorigin
berada di(0.0, 0.0)
(sudut kiri atas). Misalnya, jika Anda mengubahorigin
untukview1
Anda dapat melihat (komentar kode sebelumnya jika Anda mau) yang sekarang sudut kiri atas untukview2
menyentuh yangview1
. Motivasinya cukup sederhana. Anda mengatakan kepadaview1
bahwa sudut kiri atas kini berada pada posisi(20.0, 20.0)
tapi karenaview2
'sframe
origin
mulai dari(20.0, 20.0)
, mereka akan bertepatan.Ini
origin
mewakiliview
posisi dalamsuperview
tetapi menggambarkan posisibounds
pusat.Akhirnya,
bounds
danorigin
tidak terkait konsep. Keduanya memungkinkan untuk memperolehframe
tampilan (Lihat persamaan sebelumnya).Studi kasus View1
Inilah yang terjadi ketika menggunakan cuplikan berikut.
Gambar relatif.
Ini yang terjadi jika saya mengubah
[self view]
batasan seperti berikut.Gambar relatif.
Di sini Anda mengatakan
[self view]
bahwa sudut kiri atas sekarang berada di posisi (30.0, 20.0) tetapi karenaview1
asal bingkai dimulai dari (30.0, 20.0), mereka akan bertepatan.Referensi tambahan (untuk memperbarui dengan referensi lain jika Anda mau)
Tentang
clipsToBounds
(sumber Apple doc)Dengan kata lain, jika tampilan
frame
adalah(0, 0, 100, 100)
dan subview-nya(90, 90, 30, 30)
, Anda hanya akan melihat sebagian dari subview itu. Yang terakhir tidak akan melebihi batas tampilan induk.masksToBounds
setara denganclipsToBounds
. Alih-alih keUIView
, properti ini diterapkan keCALayer
. Di bawah tenda,clipsToBounds
panggilanmasksToBounds
. Untuk referensi lebih lanjut, lihat Bagaimana hubungan antara clipsToBounds UIView dan maskALToBounds CALayer? .sumber
Pertanyaan ini sudah memiliki jawaban yang bagus, tetapi saya ingin menambahkannya dengan beberapa gambar. Jawaban lengkap saya ada di sini.
Untuk membantu saya mengingat bingkai , saya memikirkan bingkai foto di dinding . Seperti halnya gambar dapat dipindahkan ke mana saja di dinding, sistem koordinat bingkai tampilan adalah superview. (dinding = superview, bingkai = tampilan)
Untuk membantuku mengingat batasan , aku memikirkan batasan lapangan basket . Bola basket berada di suatu tempat di dalam pengadilan seperti halnya sistem koordinat batas tampilan dalam pandangan itu sendiri. (pengadilan = tampilan, bola basket / pemain = konten di dalam tampilan)
Seperti halnya bingkai, view.center juga berada dalam koordinat superview.
Frame vs Bounds - Contoh 1
Kotak kuning mewakili bingkai tampilan. Kotak hijau mewakili batas tampilan. Titik merah di kedua gambar mewakili asal bingkai atau batas dalam sistem koordinat mereka.
Contoh 2
Contoh 3
Contoh 4
Ini sama dengan contoh 2, kecuali kali ini seluruh konten tampilan ditampilkan karena akan terlihat seperti jika tidak terpotong pada batas tampilan.
Contoh 5
Sekali lagi, lihat di sini untuk jawaban saya dengan lebih detail.
sumber
Saya menemukan gambar ini paling membantu untuk memahami bingkai, batas, dll.
Harap perhatikan juga bahwa
frame.size != bounds.size
ketika gambar diputar.sumber
Saya pikir jika Anda berpikir dari sudut pandang
CALayer
, semuanya lebih jelas.Frame sebenarnya bukan properti yang berbeda dari tampilan atau layer sama sekali, itu adalah properti virtual, dihitung dari batas, posisi (
UIView
pusat), dan transformasi.Jadi pada dasarnya bagaimana tata letak lapisan / tampilan benar-benar ditentukan oleh ketiga properti ini (dan anchorPoint), dan salah satu dari ketiga properti ini tidak akan mengubah properti lainnya, seperti mengubah transformasi tidak mengubah batas.
sumber
Ada jawaban yang sangat bagus dengan penjelasan terperinci untuk posting ini. Saya hanya ingin merujuk bahwa ada penjelasan lain dengan representasi visual untuk makna Frame, Batas, Pusat, Transform, Batas Asal dalam video WWDC 2011 Memahami Rendering UIKit mulai dari @ 4: 22 hingga 20:10
sumber
Setelah membaca jawaban di atas, di sini menambahkan interpretasi saya.
Misalkan browsing online, browser web adalah Anda
frame
yang menentukan di mana dan seberapa besar untuk menampilkan halaman web. Scroller browser adalah milik Andabounds.origin
yang menentukan bagian halaman web mana yang akan ditampilkan.bounds.origin
sulit dimengerti. Cara terbaik untuk belajar adalah membuat Aplikasi Tampilan Tunggal, mencoba memodifikasi parameter ini dan melihat bagaimana perubahan tampilan.sumber