Saya memiliki tampilan yang perlu bingkai dimanipulasi secara terprogram - ini adalah jenis tampilan dokumen yang membungkus kontennya yang kemudian digulir dan diperbesar di sekitar tampilan super dengan memanipulasi asal bingkai. Autolayout bertarung dengan ini saat runtime.
Menonaktifkan autolayout sepenuhnya tampaknya sedikit sulit karena dapat digunakan secara wajar untuk menangani tata letak untuk tampilan lain. Sepertinya yang saya inginkan adalah semacam "kendala nol".
sumber
Saya memiliki masalah serupa di mana Autolayout menimpa beberapa pengaturan bingkai saya pada waktu berjalan (saya memiliki pandangan dinamis yang dalam beberapa kasus mendorong pengontrol tampilan baru ... mendorong dan kemudian menekan Kembali akan mengatur ulang tampilan awal).
Saya menyiasatinya dengan memasukkan kode manipulasi saya ke dalam
viewDidLayoutSubviews
View Controller saya. Tampaknya ini dipanggil setelah kendala apa pun yang dipanggil mojo, tetapi sebelum viewDidAppear, jadi pengguna tidak bijaksana.sumber
Mungkin hanya menyetel
translatesAutoresizingMaskIntoConstraints
keYES
(dan tidak menambahkan batasan tambahan yang memengaruhi tampilan itu) akan memungkinkan Anda menyetel bingkai tanpa melawan sistem tata letak otomatis.sumber
Di iOS 8 Anda dapat mengatur NSLayoutConstraint menjadi aktif atau tidak. Jadi jika saya menggunakan pembuat antarmuka, saya menambahkan semua batasan saya ke OutletCollection dan kemudian mengaktifkan atau menonaktifkan menggunakan:
Aplikasi khusus yang saya gunakan di sini memiliki batasan yang berbeda dalam mode potret dan lansekap dan saya mengaktifkan / menonaktifkan berdasarkan rotasi perangkat. Ini berarti saya dapat membuat beberapa perubahan tata letak yang kompleks, semuanya dalam pembuat antarmuka untuk kedua orientasi, dan masih menggunakan tata letak otomatis tanpa kode tata letak otomatis verbose.
Atau Anda dapat mengaktifkan / menonaktifkan menggunakan removeConstraints dan addConstraints.
sumber
Saya tidak tahu apakah ini akan membantu orang lain, tetapi saya menulis kategori untuk membuat ini nyaman karena saya sering melakukan ini.
UIView + DisableAutolayoutTemporally.h
UIView + DisableAutolayoutTemporally.m
Saya menggunakannya seperti ini:
Semoga membantu.
sumber
Anda dapat mengatur
translatesAutoresizingMaskIntoConstraints
jenisnyaBoolean
, Value Yes di User Defined Runtime Attributes dari UIView yang Anda inginkan di xib / storyboard.sumber
Anda dapat membagi di beberapa papan cerita jika Anda ingin menggunakan tata letak otomatis untuk beberapa tampilan.
sumber
Bagi saya itu berhasil membuat subview secara terprogram, dalam kasus saya tata letak otomatis mengacaukan tampilan yang perlu saya putar di sekitar pusatnya tetapi begitu saya membuat tampilan ini secara terprogram, itu berfungsi.
sumber
Dalam pandangan saya, saya memiliki Label dan Teks. Label itu memiliki isyarat pan. Label bergerak dengan baik selama menyeret. Tapi ketika saya menggunakan keyboard kotak teks, label mengatur ulang posisinya ke lokasi asli yang ditentukan dalam tata letak otomatis. Masalah teratasi ketika saya menambahkan berikut ini dengan cepat untuk label. Saya menambahkan ini di viewWillAppear tetapi dapat ditambahkan cukup banyak di mana pun Anda memiliki akses ke bidang target.
sumber
Ini terjadi pada saya dalam proyek tanpa papan cerita atau file xib. Semua kode 100%. Saya memiliki spanduk iklan di bagian bawah dan ingin batas tampilan berhenti di spanduk iklan. Tampilan akan berubah ukurannya secara otomatis setelah dimuat. Saya mencoba setiap resolusi di halaman ini tetapi tidak ada yang berhasil.
Saya akhirnya hanya membuat tampilan sub dengan ketinggian yang dipersingkat dan menempatkannya ke dalam tampilan utama pengontrol. Kemudian semua konten saya masuk ke dalam tampilan sub. Itu memecahkan masalah dengan sangat mudah tanpa melakukan apa pun yang terasa bertentangan dengan arus.
Saya berpikir jika Anda menginginkan tampilan yang ukurannya tidak normal yang mengisi jendela, maka Anda harus menggunakan tampilan sub untuk itu.
sumber
Saya mengalami skenario serupa, di mana saya bergabung dengan proyek yang dimulai dengan tata letak otomatis, tetapi saya perlu membuat penyesuaian dinamis ke beberapa tampilan. Inilah yang berhasil untuk saya:
JANGAN memiliki tampilan atau komponen yang diletakkan di pembuat antarmuka.
Tambahkan tampilan Anda secara terprogram, dimulai dengan alokasi / init dan menyetel bingkainya dengan tepat.
Selesai.
sumber
Alih-alih menonaktifkan autolayout, saya hanya akan menghitung kendala baru dengan bingkai yang Anda ganti. Bagi saya itu adalah cara yang tepat. Jika Anda menyesuaikan komponen yang mengandalkan pembatas, sesuaikan.
Misalnya, jika Anda memiliki batasan vertikal 0 antara dua tampilan (myView dan otherView), dan Anda memiliki gerakan menggeser atau sesuatu yang menyesuaikan ketinggian myView, Anda dapat menghitung ulang batasan dengan nilai yang disesuaikan.
sumber
Bagi Anda yang menggunakan tata letak otomatis, silakan lihat solusi saya di sini . Anda harus membuat
@IBOutlet
batasan yang ingin Anda sesuaikan dan kemudian mengubah konstanta mereka.sumber
jika itu file xib:
sumber