Dalam kasus saya, induk UIViewController
berisi UIPageViewController
yang berisi UINavigationController
yang berisi UIViewController
. Saya perlu menambahkan gerakan menggesek ke pengontrol tampilan terakhir, tetapi gesekan ditangani seolah-olah milik pengontrol tampilan halaman. Saya mencoba melakukan ini secara terprogram dan via xib tetapi tanpa hasil.
Jadi, seperti yang saya pahami, saya tidak dapat mencapai tujuan saya sampai UIPageViewController
menangani gerakannya. Bagaimana cara mengatasi masalah ini?
ios
uiviewcontroller
uigesturerecognizer
uipageviewcontroller
pengguna2159978
sumber
sumber
pageViewControllerObject.view.userInteractionEnabled = NO;
UIPageViewController
milikiUINavigationController
. Pelanggan ingin memunculkan pengontrol navigasi pada gerakan menggesek (jika memungkinkan), tetapi pengontrol tampilan halaman menangani gesekanJawaban:
Cara terdokumentasi untuk mencegah
UIPageViewController
pengguliran adalah dengan tidak menetapkandataSource
properti. Jika Anda menetapkan sumber data, itu akan pindah ke mode navigasi 'berbasis gesture' yang merupakan apa yang ingin Anda cegah.Tanpa sumber data, Anda secara manual menyediakan pengontrol tampilan saat Anda ingin menggunakan
setViewControllers:direction:animated:completion
metode dan itu akan berpindah di antara pengontrol tampilan sesuai permintaan.Hal di atas dapat disimpulkan dari dokumentasi Apple tentang UIPageViewController (Tinjauan umum, paragraf kedua):
sumber
sumber
for (UIView *view in self.pageViewController.view.subviews) {
Saya menerjemahkan jawaban dari user2159978 ke Swift 5.1
sumber
Menerapkan solusi @ lee (@ user2159978's) sebagai ekstensi:
Penggunaan: (dalam
UIPageViewController
)sumber
var scrollView: UIScrollView? { for view in view.subviews { if let subView = view as? UIScrollView { return subView } } return nil }
Saya telah berjuang untuk sementara waktu sekarang dan berpikir saya harus memposting solusi saya, sebagai lanjutan dari jawaban Jessedc; menghapus sumber data PageViewController.
Saya menambahkan ini ke kelas PgeViewController saya (ditautkan ke pengontrol tampilan halaman di storyboard, mewarisi keduanya
UIPageViewController
danUIPageViewControllerDataSource
):Ini kemudian dapat dipanggil ketika setiap sub tampilan muncul (dalam hal ini untuk menonaktifkannya);
Saya harap ini membantu seseorang, itu tidak sebersih yang saya inginkan tetapi tidak merasa terlalu berantakan dll
EDIT: Jika seseorang ingin menerjemahkan ini ke dalam Objective-C, mohon lakukan :)
sumber
Sunting : jawaban ini hanya berfungsi untuk gaya keriting halaman. Jawaban Jessedc jauh lebih baik: bekerja terlepas dari gaya dan bergantung pada perilaku yang didokumentasikan .
UIPageViewController
memperlihatkan susunan pengenal isyarat, yang dapat Anda gunakan untuk menonaktifkannya:sumber
Jika Anda ingin
UIPageViewController
mempertahankan kemampuannya untuk menggesek, sambil memungkinkan kontrol konten Anda untuk menggunakan fitur-fiturnya (Geser untuk menghapus, dll), matikan sajacanCancelContentTouches
diUIPageViewController
.Menempatkan ini dalam Anda
UIPageViewController
'sviewDidLoad
func. (Cepat)The
UIPageViewController
memiliki subview yang dihasilkan otomatis yang menangani gerakan. Kami dapat mencegah subview ini dari membatalkan isyarat konten.Dari...
Geser untuk menghapus pada tableView yang ada di dalam pageViewController
sumber
Ekstensi berguna
UIPageViewController
untuk mengaktifkan dan menonaktifkan gesek.sumber
Saya menyelesaikannya seperti ini (Swift 4.1)
sumber
Cara cepat untuk jawaban @lee
sumber
Mirip dengan jawaban @ user3568340
Cepat 4
sumber
Terima kasih atas jawaban @ user2159978.
Saya membuatnya sedikit lebih dimengerti.
sumber
Jawaban yang saya temukan terlihat sangat membingungkan atau tidak lengkap bagi saya jadi di sini adalah solusi yang lengkap dan dapat dikonfigurasi:
Langkah 1:
Berikan masing-masing elemen PVC Anda tanggung jawab untuk mengetahui apakah gulir kiri dan kanan diaktifkan atau tidak.
Setiap pengontrol tampilan PVC Anda harus menerapkan protokol di atas.
Langkah 2:
Di pengontrol PVC Anda, nonaktifkan gulir jika perlu:
Langkah 3:
Tambahkan metode kunci gulir yang efektif ke PVC Anda:
Langkah 4:
Perbarui atribut terkait gulir saat mencapai layar baru (jika Anda beralih ke beberapa layar secara manual jangan lupa memanggil metode enableScroll):
sumber
Ada pendekatan yang jauh lebih sederhana daripada kebanyakan jawaban di sini menyarankan, yaitu untuk kembali
nil
dalamviewControllerBefore
danviewControllerAfter
panggilan balik dataSource.Ini menonaktifkan gerakan gulir pada perangkat iOS 11+, sambil menjaga kemungkinan untuk menggunakan
dataSource
(untuk hal-hal sepertipresentationIndex
/presentationCount
digunakan untuk indikator halaman)Ini juga menonaktifkan navigasi via. yang
pageControl
(titik-titik di bawah)sumber
pageViewController.view.isUserInteractionEnabled = false
sumber
Menerjemahkan tanggapan @ user2159978 ke C #:
sumber
(Swift 4) Anda dapat menghapus gestureRecognizers dari halaman Anda ViewController:
Jika Anda lebih suka dalam ekstensi:
dan
pageViewController.removeGestureRecognizers
sumber
Nyatakan seperti ini:
Kemudian gunakan seperti ini:
sumber
Menghitung subview untuk menemukan scrollView dari sebuah
UIPageViewController
tidak berfungsi untuk saya, karena saya tidak dapat menemukan scrollView di subkelas pengontrol halaman saya. Jadi yang saya pikirkan lakukan adalah menonaktifkan pengenal isyarat, tapi cukup hati-hati untuk tidak menonaktifkan yang diperlukan.Jadi saya datang dengan ini:
Masukkan itu ke dalam
viewDidLoad()
dan Anda siap!sumber
Tambahkan ini di kelas halaman viewcontroller Anda. 100% berfungsi
sumber
cukup tambahkan properti kontrol ini di subkelas UIPageViewController Anda :
sumber