Bagaimana cara ClipsToBounds bekerja?

110

Saya ingin tahu cara menggunakan UIViewproperti ini clipsToBounds.

Dokumentasi resmi mengatakan yang berikut:

clipsToBounds Properti

Nilai Boolean yang menentukan apakah subview dibatasi ke batas tampilan.

Diskusi
Mengatur nilai ini YESmenyebabkan subview dipangkas ke batas penerima. Jika disetel ke NO, subview yang bingkainya melampaui batas yang terlihat pada receiver tidak akan dipotong. Nilai defaultnya adalah NO.

Tapi saya tidak jelas tentang apa artinya sebenarnya. Bagaimana saya harus menggunakan clipsToBounds? Apa konsekuensi dari menyetel properti ini dengan YEStepat? Atau untuk NO?

Toshi
sumber

Jawaban:

283

Jika superview saya adalah kotak berukuran 10 unit di setiap sisi, dan subview saya lebar 20 unit, dengan clipsToBoundsset ke YES, saya hanya akan melihat bagian subview yang sesuai dengan batas superview. Jika tidak, jika clipsToBoundsdisetel ke NO, saya akan melihat seluruh subview, bahkan bagian di luar superview (dengan asumsi kita masih di layar).

Sebagai contoh visual, pertimbangkan tampilan berikut yang dipasang di papan cerita:

masukkan deskripsi gambar di sini

Ini berwarna putih UIView, label di sudut kiri atas dengan "1" atau "2" sederhana sehingga saya dapat membahasnya sebagai view1atau view2. Selain itu, tampilan hitam berukuran sama dengan tampilan putih, tetapi asalnya ada di tengah tampilan putih.

Dalam metode pengontrol tampilan viewDidLoad, kami memiliki kode berikut:

Objective-C:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view1.clipsToBounds = YES;
    self.view2.clipsToBounds = NO;
}

Cepat:

override func viewDidLoad() {
    super.viewDidLoad()
    self.view1.clipsToBounds = true
    self.view2.clipsToBounds = false
}

Saat kami menjalankan kode dan melihat di simulator atau di perangkat, kami mendapatkan hasil sebagai berikut:

masukkan deskripsi gambar di sini

Jadi, meskipun tampilan ini disiapkan secara identik (kecuali clipsToBounds), tampilannya berbeda. Inilah yang clipsToBoundsdilakukannya. Menyetelnya ke YESakan memberikan hasil teratas, sementara menyetelnya ke NOmemberikan hasil terbawah.

Jika kita men-debug hierarki tampilan, kita dapat melihat lebih jelas bahwa kotak hitam keduanya benar-benar melampaui boarder tampilan putih, tetapi hanya tampilan 2 yang menunjukkan ini saat aplikasi benar-benar berjalan:

masukkan deskripsi gambar di sini

nhgrif
sumber
3
Jawaban yang fantastis! Sudah selesai dilakukan dengan baik. Tapi saya punya pertanyaan. Mengapa UITextViewbayangan tidak terlihat, jika clipsToBoundsproperti sama dengan true; ? Jika ya false, berfungsi dengan baik
Mannopson
1
Catatan: Ini adalah tampilan induk tempat Anda mengubah clipsToBounds. Jadi jika viewB adalah subview dari viewA. Ini adalah pandangan bahwa clipsToBounds perlu dibuat menjadi kenyataan.
aestusLabs
Tampilan mana yang ditampilkan dari bingkai tampilan asli pada tampilan itu adalah gerakan ketuk yang berfungsi, karena saya memeriksa dan tidak berfungsi.
Pravin Tate
2

Ini dimaksudkan sebagai jawaban cepat singkat vs. jawaban yang diterima

Jika Apple untuk mengubah nama properti ini, saya akan nama itu: clipSubviewsToBounds.

Saya baru saja menemukan bug di kode kami. Di mana ketinggian tampilan induk ditetapkan 0. Kami berharap tidak melihat satu pun elemennya. Namun konten tampilan orang tua muncul.

Itu karena clipToBoundstidak diatur ke true. Setelah itu disetel ke trueketinggian subview tidak bisa melampaui 0, jadi mereka tidak tampil sama sekali.

Madu
sumber
Jawaban ini sangat diremehkan
sasquatch