UIScrollView kaydırma üste nasıl yapılır?
UIScrollView kaydırma üste nasıl yapılır?
Yanıtlar:
[self.scrollView setContentOffset:
CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];
[self.scrollView setContentOffset:CGPointZero animated:YES];
veya yatay kaydırma konumunu korumak ve sadece dikey konumu sıfırlamak istiyorsanız:
[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, 0)
animated:YES];
[scrollView setContentOffset:CGPointMake(0, -scrollView.contentInset.top) animated:YES];
[scrollView setContentOffset:CGPointMake(0, scrollView.contentSize.height-scrollView.frame.size.height) animated:YES];
İşte bunu kolaylaştıran bir Swift uzantısı:
extension UIScrollView {
func scrollToTop() {
let desiredOffset = CGPoint(x: 0, y: -contentInset.top)
setContentOffset(desiredOffset, animated: true)
}
}
Kullanımı:
myScrollView.scrollToTop()
yeni ile çalışmaya çalışın adjustedContentInset
.
Örneğin (yukarı kaydırın):
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)
Kullanmak bile
prefersLargeTitles
,safe area
vb
Swift 4 için
scrollView.setContentOffset(.zero, animated: true)
kullanım setContentOffset:animated:
[scrollView setContentOffset:CGPointZero animated:YES];
İOS7'de, iOS6'da çalışan belirli bir kaydırma görüntüsünü almakta sorun yaşadım ve bunu kaydırma görüntüsünü en üste gidecek şekilde ayarlamak için kullandım.
[self.myScroller scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
Rob Mayoff'un cevabının Swift 3.0.1 sürümü :
self.scrollView.setContentOffset(
CGPoint(x: 0,y: -self.scrollView.contentInset.top),
animated: true)
Durum çubuğunu scrollToTop davranışını tam olarak çoğaltmak için sadece contentOffset'i ayarlamakla kalmıyor, aynı zamanda scrollIndicators öğesinin görüntülendiğinden de emin olmak istiyoruz. Aksi takdirde kullanıcı hızlı bir şekilde kaybolabilir.
Bunu başarmanın tek yolu yöntemdir flashScrollIndicators
. Ne yazık ki, contentOffset'i ayarladıktan sonra bir kez çağırmanın bir etkisi yoktur, çünkü hemen sıfırlanır. Her seferinde flaş yaparken işe yaradığını gördüm 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;
});
}
UIScrollViewDelegate'inizde (veya UITable / UICollectionViewDelegate) bunu uygulayın:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.tag == SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG) {
[scrollView flashScrollIndicators];
}
}
Gizleme gecikmesi scrollToTop durum çubuğuna kıyasla biraz daha kısadır, ancak yine de güzel görünüyor.
Görünüm denetleyicileri arasında buna ihtiyacım var çünkü "isScrollingToTop" durumunu iletmek için görünüm etiketini kötüye kullandığımı unutmayın. Etiketleri başka bir şey için kullanıyorsanız, bunu bir iVar veya bir özellikle değiştirmek isteyebilirsiniz.
Önceki sürümlerin yanı sıra iOS 11 ile tam uyumlu olması gereken bir cevabım olduğunu düşünüyorum (dikey kaydırma için)
Bu hesaba yeni sürer adjustedContentInset ve ayrıca hesapları ek gereklidir ofset prefersLargeTitles varsayılan ne olursa olsun üstündeki mahsup fazladan 52px gerektirdiği görülmektedir NavigationBar etkinleştirildiğinde
Bu, biraz zor oldu çünkü adjustmentContentInset titleBar durumuna (büyük başlık vs küçük başlık) bağlı olarak değişir, bu yüzden titleBar yüksekliğinin ne olduğunu kontrol etmek ve görmek için gerekli ve zaten büyük durumda ise 52px ofset uygulamak gerekir. NavigationBar'ın durumunu kontrol etmek için başka bir yöntem bulunamadı, bu nedenle eğer herhangi birinin yükseklik> 44.0 olup olmadığını görmekten daha iyi bir seçeneği varsa, bunu duymak isterim
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)
}
}
Jakub'un çözümünden ilham aldı
Gezinme çubuğunuz , scrollView içeriğinin küçük bir kısmı ile çakıştığında çok yaygındır ve içerik üstten başlamıyor gibi görünür. Düzeltmek için 2 şey yaptım:
Kaydırma için top UITableViewController
, UICollectionViewController
ya da herhangi UIViewController
sahipUIScrollView
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)
}
}
}
}
}
SWIFT 5'te Sadece Ofset içeriğini sıfıra ayarlayın
scrollView.setContentOffset(CGPoint.zero, animated: true)
Bütün yolları denedim. Ama benim için hiçbir şey işe yaramadı. Sonunda beğendim.
Ben self.view .addSubview(self.scroll)
viewDidLoad kod satırı ekledi . Kaydırma görünümü için çerçeve ayarlama ve kaydırma görünümü için eklenen bileşenler ayarlandıktan sonra.
Benim için çalıştı.
self.view .addSubview(self.scroll)
Başlangıçta satır eklediğinizden emin olun . kullanıcı arayüzü öğeleri ekleyebilirsiniz.
UIScrollView
contentInset
, maalesef dikkate almanız gerekebilir .[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];
benim için iş yapar