Saya memiliki UIView
Springboard seperti iPhone. Saya telah membuatnya menggunakan UIScrollView
dan UIButtons
. Saya ingin menonaktifkan pengguliran horizontal pada scrollview tersebut. Saya hanya ingin pengguliran vertikal. Bagaimana saya melakukannya?
ios
objective-c
uiscrollview
Rahul Vyas
sumber
sumber
Jawaban:
Anda harus mengatur
contentSize
properti dariUIScrollView
. Misalnya, jika AndaUIScrollView
memiliki lebar 320 piksel (lebar layar), Anda dapat melakukan ini:CGSize scrollableSize = CGSizeMake(320, myScrollableHeight); [myScrollView setContentSize:scrollableSize];
The
UIScrollView
akan kemudian hanya gulir vertikal, karena sudah dapat menampilkan segala sesuatu horizontal.sumber
DIPERBARUI: (Setelah @EranMarom menunjukkan komentarnya)
Anda dapat menghentikan pengguliran horizontal atau pengguliran vertikal dalam
ScrollViewDelegate
Metode. Ini dia caranya,Menghentikan Pengguliran Horizontal:
Jika Anda ingin menggulir secara horizontal, maka Anda perlu meningkatkan contentOffset.x. Mencegah yang menghentikan scrollview scroll dalam arah horizontal.
- (void)scrollViewDidScroll:(UIScrollView *)sender { sender.contentOffset.x = 0.0 }
Menghentikan Pengguliran Vertikal:
Jika Anda ingin menggulir secara vertikal, maka Anda perlu meningkatkan contentOffset.y. Mencegah yang menghentikan scrollview scroll ke arah vertikal.
- (void)scrollViewDidScroll:(UIScrollView *)sender { sender.contentOffset.y = 0.0 }
Kode di atas mencegah perubahan dalam
x
dany
dari ascrollview contentOffset
dan itu mengarah pada penghentian metode pengguliranscrollViewDidScroll:
.sumber
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
untuk menonaktifkan scrolling horizontal. Saya merasa lebih mudah dibaca, lebih kecil, dan tidak ada gunanya melakukan tes untuk nol karena hampir tidak ada overhead dengan kode yang jarang menjalankan ini (yaitu beberapa puluh kali per detik maks).scrollView.contentOffset.y = 0.0
untuk menghentikan pengguliran vertikal danscrollView.contentOffset.x = 0.0
untuk menghentikan pengguliran horizontal, dalamscrollViewDidScroll()
fungsi delegasi. Namun, saya percaya bahwa memastikanscrollView.contentSize
sama denganscrollView.frame.size
adalah solusi yang lebih baik (benar). Lihat jawaban @danbeaulieu.sejak penggunaan iOS7
self.automaticallyAdjustsScrollViewInsets = NO;
// dan buat penggulung halaman Anda dengan 3 halaman
self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; [self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)]; [self.pageView setShowsVerticalScrollIndicator:NO]; [self.pageView setPagingEnabled:YES]; [self.view addSubview:self.pageView];
sumber
self.collectionView.pagingEnabled = YES;
membantu saya menyelesaikan masalah dengan pengguliran yang mulus (bukan menyeret). Masalahnya ada pada metodescrollViewWillEndDragging:
- targetContentOffset sama dengan scrollView.contentOffset dan logika deteksi halaman tidak berfungsi dengan benar.Buat dua outlet, satu untuk tampilan Anda dan satu untuk tampilan gulir Anda:
@IBOutlet weak var myView: UIView! @IBOutlet weak var scrollView: UIScrollView!
Kemudian di viewDidLayoutSubviews Anda, Anda dapat menambahkan kode berikut:
let scrollSize = CGSize(width: myView.frame.size.width, height: myView.frame.size.height) scrollView.contentSize = scrollSize
Apa yang telah kita lakukan adalah mengumpulkan tinggi dan lebar tampilan dan menyetel ukuran konten scrollView agar sesuai. Ini akan menghentikan tampilan gulir Anda dari bergulir secara horizontal.
Lebih Banyak Pikiran:
CGSizeMake mengambil lebar & tinggi menggunakan CGFloats. Anda mungkin perlu menggunakan ketinggian UIScrollViews yang ada untuk parameter kedua. Yang akan terlihat seperti ini:
let scrollSize = CGSize(width: myView.frame.size.width, height: scrollView.contentSize.height)
sumber
Dalam kasus saya, dengan Swift 4.2 Anda dapat menggunakan:
Nonaktifkan gulir vertikal:
func scrollViewDidScroll(_ scrollView: UIScrollView) { scrollView.contentOffset.y = 0.0 }
Nonaktifkan gulir horizontal:
func scrollViewDidScroll(_ scrollView: UIScrollView) { scrollView.contentOffset.x = 0.0 }
sumber
Anda dapat memilih tampilan, lalu di bawah
Attributes Inspector
centangUser Interaction Enabled
.sumber
Dalam kasus saya, lebar contentView lebih besar dari lebar UIScrollView dan itulah alasan pengguliran horizontal yang tidak diinginkan. Saya menyelesaikannya dengan mengatur lebar contentView sama dengan lebar UIScrollView.
Semoga bisa membantu seseorang
sumber
Saya memiliki tableview contentInset yang disetel di viewDidLoad (seperti di bawah) yang menyebabkan pengguliran horizontal
self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);
Periksa apakah ada set tableview contentInset untuk alasan yang berbeda dan nonaktifkan
sumber
Saya berjuang dengan ini untuk beberapa waktu mencoba berbagai saran tidak berhasil dalam utas ini dan lainnya.
Namun, di utas lain (tidak yakin di mana) seseorang menyarankan bahwa menggunakan batasan negatif pada UIScrollView berhasil untuknya.
Jadi saya mencoba berbagai kombinasi kendala dengan hasil yang tidak konsisten. Apa yang akhirnya berhasil bagi saya adalah menambahkan batasan leading dan trailing -32 ke scrollview dan menambahkan textview (tidak terlihat) dengan lebar 320 (dan di tengah).
sumber
Coba ini:
CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight); [scrollView setContentSize: scrollSize];
sumber
Nonaktifkan pengguliran horizontal dengan mengganti
contentOffset
properti di subkelas.override var contentOffset: CGPoint { get { return super.contentOffset } set { super.contentOffset = CGPoint(x: 0, y: newValue.y) } }
sumber
Diperkenalkan di iOS 11 adalah properti baru di
UIScrollView
var contentLayoutGuide: UILayoutGuide
Dokumentasi menyatakan bahwa Anda:
Seiring dengan kendala AutoLayout lain yang Anda mungkin menambahkan Anda akan ingin membatasi
widthAnchor
dariUIScrollView
'scontentLayoutGuide
untuk menjadi ukuran yang sama sebagai 'frame'. Anda dapat menggunakanframeLayoutGuide
(juga diperkenalkan di iOS 11) atau lebar eksternal (seperti milik AndasuperView
.)contoh:
NSLayoutConstraint.activate([ scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor) ])
Dokumentasi: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
sumber
Setelah saya melakukannya, mengganti UIScrollView dengan UITableView hanya dengan 1 sel, itu berfungsi dengan baik.
sumber
Gunakan satu baris ini.
self.automaticallyAdjustsScrollViewInsets = NO;
sumber