Saya memiliki bagian UIView
dalam UIView
m dan saya ingin bagian dalam UIView
selalu berpusat di bagian luar, tanpa harus mengubah ukuran lebar dan tinggi.
Saya telah mengatur struts dan pegas sehingga berada di atas / kiri / kanan / bawah tanpa mengatur ukurannya. Tapi itu masih tidak terpusat. Ada ide?
iphone
objective-c
ios
ipad
xonegirlz
sumber
sumber
Jawaban:
Objektif-C
Cepat
sumber
bounds
dan bukanframe
, karenaframe
tidak terdefinisi jika tampilan memilikitransform
.size
digunakan.frame
properti tidak terdefinisi jika pandangan memilikitransform
yang bukan transformasi identitas; baca dokumentasi pada properti bingkai UIView .Anda dapat melakukan ini dan itu akan selalu berhasil:
Dan untuk Swift:
sumber
child.center = parent.center
. Saya akan menggunakan `child.center = CGPointMake (parent.bounds.height / 2, parent.bounds.width / 2) '. Ini akan selalu membuat subview Anda terpusat terlepas dari apa yang diatur oleh pusat tampilan orang tua Anda.UIView.bounds
relatif terhadap tampilan itu sendiri (dan karenabounds.origin
itu awalnya nol), sementaraUIView.center
ditentukan dalam sistem koordinat superview .Sebelum kita mulai, mari kita ingatkan bahwa titik asal adalah sudut kiri
CGPoint
atas tampilan. Suatu hal penting untuk dipahami tentang pandangan dan orang tua.Mari kita lihat kode sederhana ini, pengontrol tampilan yang menambah tampilan kotak hitam:
Ini akan membuat tampilan ini: asal dan pusat persegi panjang hitam tidak cocok dengan koordinat yang sama seperti orang tuanya
Sekarang mari kita coba menambahkan subView SubSubView lain, dan memberikan subSubview asal yang sama dengan subView, tetapi buat subSubView tampilan anak dari subView
Kami akan menambahkan kode ini:
Dan inilah hasilnya:
Karena baris ini:
Anda mengharapkan asal persegi ungu untuk sama dengan orang tuanya (persegi panjang hitam) tetapi berada di bawahnya, dan mengapa begitu? Karena ketika Anda menambahkan tampilan ke tampilan lain, frame subView "dunia" sekarang adalah parent BOUND RECTANGLE, jika Anda memiliki pandangan bahwa itu asalnya pada layar utama adalah pada coords (15,15) untuk semua sub tampilan itu, sudut kiri atas adalah (0,0)
Inilah sebabnya mengapa Anda harus selalu merujuk ke induk dengan persegi panjang terikat itu, yang merupakan "dunia" dari subViews itu, mari perbaiki baris ini ke:
Dan lihat keajaibannya, subSubview sekarang terletak persis di asal orangtuanya:
Jadi, Anda suka, "Saya hanya ingin memusatkan pandangan saya dengan pandangan orang tua saya, apa masalahnya?" baik, itu bukan masalah besar, Anda hanya perlu "menerjemahkan" titik pusat induk yang diambil dari bingkai itu ke pusat batas induk dengan melakukan ini:
Anda sebenarnya mengatakan kepadanya "bawa pusat tampilan orang tua, dan ubah menjadi dunia subSubView".
Dan Anda akan mendapatkan hasil ini:
sumber
Saya akan menggunakan:
Saya suka menggunakan
CGRect
opsi ...SWIFT 3:
sumber
1. Jika Anda mengaktifkan pembayaran otomatis:
Pertama-tama nonaktifkan pandangan anak autoresizing
Jika Anda UIView + Autolayout atau Purelayout :
Jika Anda hanya menggunakan metode pembayaran otomatis tingkat UIKit:
2. Tanpa pembayaran otomatis:
Saya lebih memilih:
sumber
CGRectIntegral
Cara termudah:
sumber
Atur topeng autoresizing ini ke tampilan dalam Anda.
sumber
Dengan iOS9 Anda dapat menggunakan layout anchor API.
Kode akan terlihat seperti ini:
Keuntungan dari ini lebih
CGPointMake
atauCGRect
adalah bahwa dengan metode-metode itu Anda menetapkan pusat pandangan ke konstan tetapi dengan teknik ini Anda menetapkan hubungan antara dua pandangan yang akan bertahan selamanya, tidak peduli bagaimanaparentview
perubahannya.Pastikan sebelum Anda melakukan ini untuk melakukan:
dan untuk mengatur
translatesAutoresizingMaskIntoConstraints
agar setiap tampilan menjadi false.Ini akan mencegah gangguan dan AutoLayout mengganggu.
sumber
Kamu bisa memakai
Dan In Swift 3.0
sumber
Menggunakan pusat yang sama dalam tampilan dan subview adalah cara paling sederhana untuk melakukannya. Anda dapat melakukan sesuatu seperti ini,
sumber
Solusi lain dengan menggunakan PureLayout
autoCenterInSuperview
.Begini tampilannya:
sumber
Di c # atau Xamarin.ios, kita bisa menggunakan seperti ini
imageView.Center = CGPoint baru (tempView.Frame.Size.Width / 2, tempView.Frame.Size.Height / 2);
sumber
Saya akan menggunakan:
Ini sederhana, pendek, dan manis. Jika Anda menggunakan jawaban @ Hejazi di atas dan
parent.center
diatur ke hal lain selain(0,0)
subview Anda tidak akan terpusat!sumber
sumber