Saya membuat dua tampilan dalam satu superview, dan kemudian menambahkan batasan antara tampilan:
_indicatorConstrainWidth = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeWidth multiplier:1.0f constant:0.0f];
[_indicatorConstrainWidth setPriority:UILayoutPriorityDefaultLow];
_indicatorConstrainHeight = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view2 attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0.0f];
[_indicatorConstrainHeight setPriority:UILayoutPriorityDefaultLow];
[self addConstraint:_indicatorConstrainWidth];
[self addConstraint:_indicatorConstrainHeight];
Sekarang saya ingin mengubah properti pengganda dengan animasi, tetapi saya tidak tahu cara mengubah properti pengganda. (Saya menemukan _coefisien dalam properti pribadi di file header NSLayoutConstraint.h, tetapi bersifat pribadi.)
Bagaimana cara mengubah properti multipler?
Solusi saya adalah menghapus batasan lama dan menambahkan yang baru dengan nilai berbeda untuk multipler
.
ios
iphone
objective-c
nslayoutconstraint
Bimawa
sumber
sumber
Jawaban:
Jika Anda hanya memiliki dua set pengganda yang perlu diterapkan, dari iOS8 dan seterusnya Anda dapat menambahkan kedua set kendala dan memutuskan mana yang harus aktif kapan saja:
Versi Swift 5.0
sumber
addConstraint(_:)
danremoveConstraint(_:)
pada pandangan yang merupakan leluhur umum terdekat dari item yang dikelola oleh kendala ini".Berikut ini adalah ekstensi NSLayoutConstraint di Swift yang membuat pengaturan pengganda baru cukup mudah:
Di Swift 3.0+
Penggunaan demo:
sumber
NSLayoutConstraint.deactivateConstraints([self])
harus dilakukan sebelum membuatnewConstraint
, jika tidak dapat mengakibatkan peringatan: Tidak dapat secara bersamaan memenuhi kendala . JuganewConstraint.active = true
tidak perlu karenaNSLayoutConstraint.activateConstraints([newConstraint])
melakukan hal yang persis sama.cloneWithMultiplier
lebih eksplisit sehingga tidak hanya menerapkan efek samping tetapi mengembalikan batasan baru0.0
Anda tidak akan dapat memperbaruinya lagi.Itu
multiplier
properti baca saja. Anda harus menghapus NSLayoutConstraint lama dan menggantinya dengan yang baru untuk memodifikasinya.Namun, karena Anda tahu Anda ingin mengubah pengali, Anda bisa mengubah konstanta dengan mengalikannya sendiri saat diperlukan perubahan yang seringkali lebih sedikit kode.
sumber
View2.bottomY
's saat ini nilai untuk menghitung kendala ini baru konstan. Itu cacat, karenaView2.bottomY
nilai lama akan dipanggang dalam konstanta, jadi Anda harus melepaskan gaya deklaratif dan secara manual memperbarui batasan kapan sajaView2.bottomY
perubahan. Dalam hal ini Anda mungkin juga melakukan tata letak manual.Fungsi pembantu saya gunakan untuk mengubah pengali dari batasan tata letak yang ada. Ini menciptakan dan mengaktifkan kendala baru dan menonaktifkan yang lama.
Penggunaan, mengubah pengali menjadi 1.2:
sumber
NSLayoutConstraint.deactivate
fungsi hanya iOS 8.0+.Versi Objective-C untuk jawaban Andrew Schreiber
Buat kategori untuk NSLayoutConstraint Class dan tambahkan metode dalam file .h seperti ini
Dalam file .m
Kemudian di ViewController buat outlet untuk batasan yang ingin Anda perbarui.
dan perbarui pengganda di mana pun Anda inginkan seperti di bawah ini ..
sumber
active = true
sama dengan mengaktifkan dan karena itu menyebabkan kendala duplikat ditambahkan sebelum menonaktifkan disebut, ini menyebabkan kesalahan kendala dalam beberapa skenario.Anda dapat mengubah properti "konstan" sebagai gantinya untuk mencapai tujuan yang sama dengan sedikit matematika. Asumsikan pengganda default Anda pada kendala adalah 1.0f. Ini adalah kode Xamarin C # yang dapat dengan mudah diterjemahkan ke objektif-c
sumber
Seperti dalam jawaban lain yang dijelaskan: Anda harus menghapus kendala dan membuat yang baru.
Anda dapat menghindari mengembalikan batasan baru dengan membuat metode statis
NSLayoutConstraint
denganinout
parameter, yang memungkinkan Anda untuk menetapkan kembali batasan yang lewatContoh penggunaan:
sumber
TIDAK ADA KODE DI ATAS YANG BEKERJA BAGI SAYA JADI SETELAH MENCOBA UNTUK MEMODIFIKASI KODE SENDIRI SAYA KODE INI Kode ini berfungsi di Xcode 10 dan swift 4.2
sumber
Ya, kami dapat mengubah nilai pengali hanya membuat ekstensi NSLayoutConstraint dan menggunakannya seperti ->
sumber
Beralih dengan mengubah batasan aktif dalam kode seperti yang disarankan oleh banyak jawaban lain tidak berhasil untuk saya. Jadi saya membuat 2 batasan, satu terpasang dan yang lainnya tidak, mengikat keduanya ke kode, dan kemudian beralih dengan menghapus satu dan menambahkan yang lain.
Demi kelengkapan, untuk mengikat konstrain, seret konstrain ke kode menggunakan tombol kanan mouse, sama seperti elemen grafis lainnya:
Saya menyebutkan satu proporsi proporsi dan satu proporsi proporsi.
Kemudian, tambahkan kode berikut, di viewDidLoad
Saya menggunakan xCode 10 dan swift 5.0
sumber
Berikut adalah jawaban berdasarkan jawaban @ Tianfu di C #. Jawaban lain yang memerlukan aktivasi dan penonaktifan kendala tidak berfungsi untuk saya.
sumber
Untuk mengubah nilai pengali, ikuti langkah-langkah di bawah ini: 1. buat outlet untuk kendala yang diperlukan misalnya, beberapa kendala. 2. ubah nilai pengali seperti someConstraint.constant * = 0.8 atau nilai pengali apa pun.
itu saja, selamat coding.
sumber
Seseorang dapat membaca:
di halaman dokumentasi ini . Bukankah itu berarti bahwa seseorang harus dapat memodifikasi pengganda (karena itu adalah var)?
sumber
var multiplier: CGFloat { get }
adalah definisi yang berarti hanya memiliki pengambil.