Saya mencoba mencari tahu ini sejak minggu lalu tanpa melangkah lebih jauh. Ok, jadi saya perlu menerapkan beberapa kendala secara terprogram di Swift untuk UIView
menggunakan kode ini:
var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100));
new_view.backgroundColor = UIColor.redColor();
view.addSubview(new_view);
var constX:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0);
self.view.addConstraint(constX);
var constY:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0);
self.view.addConstraint(constY);
var constW:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0);
self.view.addConstraint(constW);
var constH:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 0);
self.view.addConstraint(constH);
Tapi Xcode mengembalikan output aneh ini:
2014-10-03 09:48:12.657 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea4516c0 h=--& v=--& UIView:0x7fa4ea429290.midX == + 50>",
"<NSLayoutConstraint:0x7fa4ea452830 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fa4ea4470f0(375)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea446db0 h=-&- v=-&- 'UIView-Encapsulated-Layout-Left' H:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in
<UIKit/UIView.h> may also be helpful.
2014-10-03 09:48:12.658 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea451b30 h=--& v=--& UIView:0x7fa4ea429290.midY == + 50>",
"<NSLayoutConstraint:0x7fa4ea44cf00 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7fa4ea4470f0(667)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea452700 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
Bisakah kamu membantuku? Terima kasih banyak
ios
swift
uiview
autolayout
nslayoutconstraint
Sara Canducci
sumber
sumber
>
. Saya telah memperbaikinya untuk Anda saat ini.Jawaban:
Apakah Anda berencana untuk memiliki kuadrat
UIView
dari width: 100 dan Height: 100 berpusat di dalamUIView
sebuahUIViewController
? Jika demikian, Anda dapat mencoba salah satu dari 6 gaya Tata Letak Otomatis berikut (Swift 5 / iOS 12.2):1. Menggunakan
NSLayoutConstraint
penginisialisasi2. Menggunakan Bahasa Format Visual
3. Menggunakan campuran
NSLayoutConstraint
inisialisasi dan Bahasa Format Visual4. Menggunakan
UIView.AutoresizingMask
Catatan: Pegas dan Struts akan diterjemahkan ke dalam batasan tata letak otomatis terkait saat runtime.
5. Menggunakan
NSLayoutAnchor
6. Menggunakan
intrinsicContentSize
danNSLayoutAnchor
Hasil:
sumber
newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
newView.translatesAutoresizingMaskIntoConstraints = false
bagiannya! Butuh beberapa saat untuk melihatnya.Ini membantu saya untuk belajar secara visual, jadi ini adalah jawaban tambahan.
Kode pelat ketel
Masing-masing contoh berikut tidak tergantung pada yang lain.
Sematkan tepi kiri
myView.leading = leadingMargin + 20
Metode 1: Gaya Jangkar
leadingAnchor
itu, ada jugatrailingAnchor
,topAnchor
, danbottomAnchor
.Metode 2: Gaya NSLayoutConstraint
.leading
ada juga.trailing
,.top
dan.bottom
..leadingMargin
ada juga.trailingMargin
,.topMargin
, dan.bottomMargin
.Atur Lebar dan Tinggi
width = 200
height = 100
Metode 1: Gaya Jangkar
Metode 2: Gaya NSLayoutConstraint
Pusat dalam wadah
myView.centerX = centerX
myView.centerY = centerY
Metode 1: Gaya Jangkar
Metode 2: Gaya NSLayoutConstraint
Catatan
NSLayoutConstraint
Style, namun itu hanya tersedia dari iOS 9, jadi jika Anda mendukung iOS 8 maka Anda harus tetap menggunakanNSLayoutConstraint
Gaya.myView
dalam proyek pengujian saya, saya perlu memiliki empat kendala.Bacaan lebih lanjut
sumber
leading
vscenterX
kendala yang harus ditentukan.addConstraint()
diview
dalam rangka untuk membuat layoutconstraints mendaftar.Jika Anda ingin mengisi tampilan super Anda maka saya sarankan cara cepat:
Lain bijaksana jika Anda memerlukan kendala yang tidak sama, periksa NSLayoutAnchor pada iOS 9. Sering kali lebih mudah untuk membaca bahwa menggunakan NSLayoutConstraint secara langsung:
sumber
isActive = true
tidak selalu merupakan ide yang baik. Lebih baik dan lebih berkinerja untuk mengelompokkan kendala terkait menjadi satu dan mengaktifkannya sekaligus menggunakanNSLayoutConstraint.activate
.Kendala untuk beberapa tampilan di taman bermain.
cepat 3+
sumber
Masalahnya, seperti yang ditunjukkan pesan kesalahan, adalah bahwa Anda memiliki batasan tipe
NSAutoresizingMaskLayoutConstraints
yang bertentangan dengan batasan eksplisit Anda, karenanew_view.translatesAutoresizingMaskIntoConstraints
disetel ke true.Ini adalah pengaturan default untuk tampilan yang Anda buat dalam kode. Anda dapat mematikannya seperti ini:
Juga, batasan lebar dan tinggi Anda aneh. Jika Anda ingin tampilan memiliki lebar konstan, ini adalah cara yang tepat:
(Ganti 100 dengan lebar yang Anda inginkan.)
Jika target penggunaan Anda adalah iOS 9.0 atau lebih baru, Anda dapat menggunakan kode yang lebih pendek ini:
Bagaimanapun, untuk tata letak seperti ini (ukuran tetap dan berpusat di tampilan induk), akan lebih mudah untuk menggunakan masker autoresizing dan biarkan sistem menerjemahkan topeng ke dalam batasan:
Perhatikan bahwa menggunakan autoresisasi sangat sah bahkan ketika Anda juga menggunakan pembayaran otomatis. (UIKit masih menggunakan autoresizing di banyak tempat secara internal.) Masalahnya adalah sulit untuk menerapkan kendala tambahan pada tampilan yang menggunakan autoresizing.
sumber
Pada dasarnya itu melibatkan 3 langkah
Ini menempatkan label "hello world" di tengah layar.
Silakan merujuk tautan Batasan Autolayout secara terprogram
sumber
Diperbarui untuk Swift 3
Jenis Kendala
sumber
Tata letak otomatis diwujudkan dengan menerapkan batasan pada gambar. Gunakan NSLayoutConstraint. Dimungkinkan untuk menerapkan desain yang ideal dan indah di semua perangkat. Silakan coba kode di bawah ini.
sumber
ini sedikit berbeda di xcode 7.3.1. ini yang saya buat
sumber
Ingin menambahkan beberapa konsep teoritis ke jawaban Imanou Petit, sehingga orang dapat memahami cara kerja tata letak otomatis.
Untuk memahami tata letak otomatis pertimbangkan pandangan Anda sebagai objek karet yang menyusut pada awalnya.
Untuk menempatkan objek di layar kita perlu 4 hal wajib:
X koordinat objek (posisi horizontal).
Koordinat objek Y (posisi vertikal)
Lebar Obyek
Tinggi Objek.
1 koordinat X: Ada beberapa cara untuk memberikan koordinat x ke tampilan.
Seperti Leading constraint, Trailing constraint, Horizontal centre dll.
Koordinat 2 Y: Ada beberapa cara untuk memberikan koordinat y ke tampilan:
Seperti batasan atas, batasan bawah, pusat vertikal dll
3 Lebar objek: Ada dua cara untuk memberi batasan lebar pada tampilan:
Sebuah. Tambahkan batasan lebar tetap (pertimbangkan batasan ini sebagai batang besi dengan lebar tetap dan Anda telah mengaitkan objek karet Anda secara horizontal dengannya sehingga objek karet tidak menyusut atau membesar)
b. Jangan tambahkan batasan lebar apa pun tetapi tambahkan kendala koordinat x untuk trailing dan leading view di kedua ujung, kedua kendala ini akan memperluas / mengecilkan objek karet Anda dengan menarik / mendorongnya dari kedua ujungnya, memimpin dan mengikuti.
4 Tinggi objek: Mirip dengan lebar, ada dua cara memberi batasan ketinggian untuk tampilan juga:
Sebuah. Tambahkan batasan ketinggian tetap (pertimbangkan kendala ini sebagai batang besi dengan ketinggian tetap dan Anda telah mengaitkan objek karet Anda secara vertikal sehingga objek karet tidak menyusut atau mengembang)
b. Jangan tambahkan batasan ketinggian apa pun tetapi tambahkan batasan koordinat x untuk kedua ujung tampilan atas dan bawah, kedua kendala ini akan memperluas / mengecilkan objek karet Anda dengan menarik / mendorongnya dari kedua ujung, atas dan bawah.
sumber
sumber
Ini adalah salah satu cara untuk menambahkan kendala secara pemrograman
sumber
Anda menambahkan semua batasan
self.view
yang salah, karena batasan lebar dan tinggi harus ditambahkan ke AndanewView
.Juga, seperti yang saya mengerti Anda ingin mengatur lebar dan tinggi konstan 100: 100. Dalam hal ini Anda harus mengubah kode Anda menjadi:
sumber
Jika Anda menemukan di atas menjadi jelek. Anda harus mempertimbangkan menggunakan DSL untuk kendala. Seperti SnapKit Membuat API kendala jauh lebih ramah pengguna
sumber
Kita dapat dengan mudah melakukan ini dengan cepat 5.1
pengaturan 1
tinggi lebar subview diatur menggunakan float
pengaturan 2
Lebar subview diatur menggunakan ketinggian tampilan view
sumber
Coba
UIView
ekstensi elegan ini untuk kendala. Anda dapat melakukan kendala semudah:Ini ekstensi, cukup salin ke proyek Anda.
sumber