Saat ini, tidak, sepertinya tidak mungkin untuk memusatkan tampilan di superview hanya menggunakan VFL. Namun, tidak sulit untuk melakukannya dengan menggunakan string VFL tunggal dan satu kendala tambahan tunggal (per sumbu):
VFL: "|-(>=20)-[view]-(>=20)-|"
[NSLayoutConstraint constraintWithItem:view
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:view.superview
attribute:NSLayoutAttributeCenterX
multiplier:1.f constant:0.f];
Orang akan berpikir bahwa Anda hanya dapat melakukan ini (yang awalnya saya pikirkan dan coba ketika saya melihat pertanyaan ini):
[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=20)-[view(==200)]-(>=20)-|"
options: NSLayoutFormatAlignAllCenterX | NSLayoutFormatAlignAllCenterY
metrics:nil
views:@{@"view" : view}];
Saya mencoba banyak variasi berbeda dari yang di atas mencoba untuk menekuknya sesuai keinginan saya, tetapi ini tampaknya tidak berlaku untuk superview bahkan ketika secara eksplisit memiliki dua string VFL yang terpisah untuk kedua sumbu ( H:|V:
). Saya kemudian mulai mencoba dan mengisolasi kapan tepatnya opsi yang bisa diterapkan pada VFL. Mereka tampaknya tidak berlaku untuk superview dalam VFL dan hanya akan berlaku untuk pandangan eksplisit yang disebutkan dalam string VFL (yang mengecewakan dalam kasus-kasus tertentu).
Saya berharap di masa depan Apple menambahkan beberapa jenis opsi baru agar opsi VFL memperhitungkan superview, bahkan jika melakukannya hanya ketika hanya ada satu tampilan eksplisit selain superview dalam VFL. Solusi lain bisa menjadi pilihan lain dilewatkan ke dalam VFL yang mengatakan sesuatu seperti: NSLayoutFormatOptionIncludeSuperview
.
Tak perlu dikatakan, saya belajar banyak tentang VFL mencoba menjawab pertanyaan ini.
|
dan[superview]
sebagai entitas internal yang terpisah meskipun mereka mewakili objek semantik yang sama. Dengan menggunakan[superview]
, autolayout termasuk objek superview dalam metrik penyelarasannya (dalam kasus ini dalam jawabannya di tautan github, theNSLayoutFormatAlignAllCenterY
/X
metric).Ya, dimungkinkan untuk memusatkan tampilan dalam superview dengan Bahasa Format Visual. Baik secara vertikal maupun horizontal. Inilah demo:
https://github.com/evgenyneu/center-vfl
sumber
Saya pikir lebih baik secara manual membuat batasan.
Sekarang kita dapat menggunakan NSLayoutAnchor untuk secara otomatis mendefinisikan AutoLayout:
(Tersedia di iOS 9.0 dan yang lebih baru)
Saya sarankan menggunakan SnapKit , yang merupakan DSL untuk mempermudah Tata Letak Otomatis pada iOS dan macOS.
sumber
Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.
Sepenuhnya mungkin dapat melakukannya seperti ini:
Pelajari ini dari sini. Kode di atas memusatkan subview yang dilihat oleh Y jelas.
Swift3:
sumber
Tambahkan kode di bawah ini dan arahkan tombol Anda di tengah layar. Sangat mungkin.
sumber
Saya tahu Anda tidak menginginkannya tetapi tentu saja Anda dapat menghitung margin dan menggunakannya untuk membuat string format visual;)
Bagaimanapun, tidak. Sayangnya itu tidak mungkin untuk melakukan itu 'secara otomatis' dengan VFL - setidaknya belum.
sumber
Berkat jawaban dari @Evgenii, saya membuat contoh lengkap di intinya:
pusat kotak merah secara vertikal dengan tinggi khusus
https://gist.github.com/yallenh/9fc2104b719742ae51384ed95dcaf626
Anda dapat memusatkan tampilan secara vertikal dengan menggunakan VFL (yang tidak terlalu intuitif) atau menggunakan kendala secara manual. Ngomong-ngomong, saya tidak bisa menggabungkan centerY dan tinggi bersama dalam VFL seperti:
Dalam solusi saat ini kendala VFL ditambahkan secara terpisah.
sumber
Yang harus dilakukan adalah bahwa superview harus dinyatakan dalam kamus. Alih-alih menggunakan yang
|
Anda gunakan@{@"super": view.superview};
.Dan
NSLayoutFormatAlignAllCenterX
untukNSLayoutFormatAlignAllCenterY
opsi vertikal dan horizontal.sumber
Anda dapat menggunakan tampilan ekstra.
Jika Anda menginginkannya rapi, maka
centerXView.hidden = centerYView.hidden = YES;
.PS: Saya tidak yakin bisa menyebut pandangan ekstra "placeholder", karena bahasa Inggris adalah bahasa kedua saya. Ini akan dihargai jika seseorang bisa mengatakannya kepada saya.
sumber
Bagi mereka yang datang ke sini untuk
Interface Builder
solusi berbasis (Google membawa saya ke sini), cukup tambahkan lebar const / batasan ketinggian, dan pilih subview -> control drag ke superview itu -> pilih "pusatkan secara vertikal / horizontal dalam superview".sumber
Ini metode saya
sumber
Hanya perlu mengatakan, bahwa Anda dapat menggunakan ini alih-alih kendala:
sumber
@ igor-muzyka menjawab di Swift 2 :
sumber
Alih-alih menggunakan VFL, Anda dapat dengan mudah melakukan ini di pembuat antarmuka. Di Main Storyboard, ctrl + klik pada tampilan yang Anda ingin pusatkan. Seret ke superview (sambil menahan ctrl) dan pilih "Center X" atau "Center Y". Tidak diperlukan kode.
sumber