Bagaimana cara membuat gulir UIScrollView ke atas?
Bagaimana cara membuat gulir UIScrollView ke atas?
Jawaban:
[self.scrollView setContentOffset:
CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];
[self.scrollView setContentOffset:CGPointZero animated:YES];
atau jika Anda ingin mempertahankan posisi gulir horizontal dan cukup mengatur ulang posisi vertikal:
[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, 0)
animated:YES];
[scrollView setContentOffset:CGPointMake(0, -scrollView.contentInset.top) animated:YES];
Ini bekerja di iOS 6 & 7
[scrollView setContentOffset:CGPointMake(0, scrollView.contentSize.height-scrollView.frame.size.height) animated:YES];
Berikut ini adalah ekstensi Swift yang membuatnya mudah:
extension UIScrollView {
func scrollToTop() {
let desiredOffset = CGPoint(x: 0, y: -contentInset.top)
setContentOffset(desiredOffset, animated: true)
}
}
Pemakaian:
myScrollView.scrollToTop()
cobalah bekerja dengan yang baru adjustedContentInset
.
Misalnya (gulir ke atas):
var offset = CGPoint(
x: -scrollView.contentInset.left,
y: -scrollView.contentInset.top)
if #available(iOS 11.0, *) {
offset = CGPoint(
x: -scrollView.adjustedContentInset.left,
y: -scrollView.adjustedContentInset.top)
}
scrollView.setContentOffset(offset, animated: true)
Bahkan jika Anda menggunakan
prefersLargeTitles
,safe area
dll.
Untuk Swift 4
scrollView.setContentOffset(.zero, animated: true)
Menggunakan setContentOffset:animated:
[scrollView setContentOffset:CGPointZero animated:YES];
Di iOS7 saya kesulitan mendapatkan scrollview tertentu untuk pergi ke atas, yang berfungsi di iOS6, dan menggunakan ini untuk mengatur scrollview untuk pergi ke atas.
[self.myScroller scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
Jawaban rob mayoff versi Swift 3.0.1 :
self.scrollView.setContentOffset(
CGPoint(x: 0,y: -self.scrollView.contentInset.top),
animated: true)
Untuk sepenuhnya mereplikasi bilah status perilaku scrollToTop kita tidak hanya harus mengatur contentOffset tetapi juga ingin memastikan scrollindikator ditampilkan. Kalau tidak, pengguna dapat dengan cepat tersesat.
Satu-satunya metode publik untuk mencapai ini adalah flashScrollIndicators
. Sayangnya, memanggilnya sekali setelah mengatur contentOffset tidak berpengaruh karena segera direset. Saya menemukan ini berfungsi ketika melakukan flash setiap kali masuk scrollViewDidScroll:
.
// define arbitrary tag number in a global constants or in the .pch file
#define SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG 19291
- (void)scrollContentToTop {
[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];
self.scrollView.tag = SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.scrollView.tag = 0;
});
}
Dalam UIScrollViewDelegate Anda (atau UITable / UICollectionViewDelegate) terapkan ini:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.tag == SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG) {
[scrollView flashScrollIndicators];
}
}
Sembunyikan penundaan agak lebih pendek dibandingkan dengan status bar perilaku scrollToTop tetapi masih terlihat bagus.
Perhatikan bahwa saya menyalahgunakan tag tampilan untuk mengomunikasikan keadaan "isScrollingToTop" karena saya memerlukan ini di seluruh pengontrol tampilan. Jika Anda menggunakan tag untuk hal lain, Anda mungkin ingin menggantinya dengan iVar atau properti.
Saya rasa saya punya jawaban yang harus sepenuhnya kompatibel dengan iOS 11 serta versi sebelumnya (untuk pengguliran vertikal)
Ini memperhitungkan baru adjustedContentInset dan juga menyumbang tambahan offset yang diperlukan bila prefersLargeTitles diaktifkan pada navigationbar yang tampaknya memerlukan 52px ekstra mengimbangi di atas apa pun defaultnya adalah
Ini sedikit rumit karena perubahan CustomizedContentInset tergantung pada status titleBar (judul besar vs judul kecil) jadi saya perlu memeriksa dan melihat apa ketinggian titleBar dan tidak menerapkan offset 52px jika sudah dalam keadaan besar. Tidak dapat menemukan metode lain untuk memeriksa keadaan navigasiBar jadi jika ada yang memiliki opsi yang lebih baik daripada melihat apakah tingginya> 44,0 Saya ingin mendengarnya
func scrollToTop(_ scrollView: UIScrollView, animated: Bool = true) {
if #available(iOS 11.0, *) {
let expandedBar = (navigationController?.navigationBar.frame.height ?? 64.0 > 44.0)
let largeTitles = (navigationController?.navigationBar.prefersLargeTitles) ?? false
let offset: CGFloat = (largeTitles && !expandedBar) ? 52: 0
scrollView.setContentOffset(CGPoint(x: 0, y: -(scrollView.adjustedContentInset.top + offset)), animated: animated)
} else {
scrollView.setContentOffset(CGPoint(x: 0, y: -scrollView.contentInset.top), animated: animated)
}
}
Terinspirasi oleh solusi Jakub
Ini sangat umum ketika bilah navigasi Anda tumpang tindih dengan sebagian kecil konten scrollView dan sepertinya konten dimulai bukan dari atas. Untuk memperbaikinya saya melakukan 2 hal:
Gulir ke atas untuk UITableViewController
, UICollectionViewController
atau yang UIViewController
memilikiUIScrollView
extension UIViewController {
func scrollToTop(animated: Bool) {
if let tv = self as? UITableViewController {
tv.tableView.setContentOffset(CGPoint.zero, animated: animated)
} else if let cv = self as? UICollectionViewController{
cv.collectionView?.setContentOffset(CGPoint.zero, animated: animated)
} else {
for v in view.subviews {
if let sv = v as? UIScrollView {
sv.setContentOffset(CGPoint.zero, animated: animated)
}
}
}
}
}
Di SWIFT 5 Cukup atur konten Offset ke nol
scrollView.setContentOffset(CGPoint.zero, animated: true)
Saya mencoba semua cara. Tetapi tidak ada yang berhasil untuk saya. Akhirnya saya suka ini.
Saya menambahkan self.view .addSubview(self.scroll)
baris kode di viewDidLoad. Setelah mulai mengatur bingkai untuk tampilan gulir dan menambahkan komponen untuk tampilan gulir.
Ini berhasil untuk saya.
Pastikan Anda menambahkan self.view .addSubview(self.scroll)
baris di awal. maka Anda dapat menambahkan elemen UI.
UIScrollView
contentInset
, sayangnya.[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];
melakukan pekerjaan untuk saya