UITableView - शीर्ष पर स्क्रॉल करें


392

मेरे तालिका दृश्य में मुझे शीर्ष पर स्क्रॉल करना होगा। लेकिन मैं इस बात की गारंटी नहीं दे सकता कि पहली वस्तु खंड ०, पंक्ति ० हो सकती है। हो सकता है कि मेरा तालिका दृश्य खंड संख्या ५ से शुरू होगा।

इसलिए मुझे एक अपवाद मिलता है, जब मैं फोन करता हूं:

[mainTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

टेबल व्यू के शीर्ष पर स्क्रॉल करने का एक और तरीका है?

जवाबों:


856

UITableView UIScrollView का एक उपवर्ग है, इसलिए आप इसका उपयोग भी कर सकते हैं:

[mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];

या

[mainTableView setContentOffset:CGPointZero animated:YES];

और स्विफ्ट में:

mainTableView.setContentOffset(CGPointZero, animated:true)

और स्विफ्ट 3 और ऊपर:

mainTableView.setContentOffset(.zero, animated: true)

9
मैंने पहली बार CGRectZero के साथ यह कोशिश की, जो CGRectMake (0, 0, 0, 0) के बराबर है। यह काम नहीं करता है, लेकिन ऊपर अजीब तरह से करता है। मुझे लगता है कि इसे एक सकारात्मक चौड़ाई और ऊंचाई की आवश्यकता है। धन्यवाद।
केलर

5
ध्यान दें, आप एनिमेटेड चाहते हैं : NO अगर आप इसे स्क्रॉलटॉ रॉटएंडएंडएक्सपैथ में चलाते हैं: ताकि टेबल को सही स्थिति में शुरू किया जा सके। आशा है ये मदद करेगा!
फेटी

3
@ hasan83 CGRectMake (0, 0, 0, 0) या CGRectZero एक दृश्यमान आयत नहीं है। मैं यह भी कहूंगा कि [mainTableView setContentOffset: CGPointZero एनिमेटेड: YES]; पूर्ववर्ती अभिव्यक्ति है।
कैटलान

8
किसी ने देखा कि iOS11 में यह सब टूट गया है और कुछ मामलों में सही ढंग से स्क्रॉल नहीं कर रहा है?
पीटर लापिसु

11
@PeterLapisu self.tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.top, animated: true)iOS 11 में काम करता है
जॉर्डन एस

246

नोट : यह उत्तर iOS 11 और बाद के लिए मान्य नहीं है।

मैं पसंद करता हूं

[mainTableView setContentOffset:CGPointZero animated:YES];

यदि आपके पास अपने टेबल दृश्य पर एक शीर्ष इनसेट है, तो आपको इसे घटाना होगा:

[mainTableView setContentOffset:CGPointMake(0.0f, -mainTableView.contentInset.top) animated:YES];

12
टमाटर, टमाटर। हम्म ... यह लेखन में बहुत स्पष्ट रूप से नहीं आता है।
FreeAsInBeer

14
यह सबसे अच्छा तरीका है जब आप टेबल हेडर या फुटर व्यूज का उपयोग करते हैं और चाहते हैं कि उन्हें भी शामिल किया जाए।
mafonya 20

6
यह वास्तव में एक स्पष्ट कोड है, लेकिन यह तब काम नहीं करता है जब आपके ऊपर से tableViewशून्य न contentInsetहो। उदाहरण के लिए tableView.contentInset = UIEdgeInsetsMake(5.0f, 0.0f, 250.0f, 0.0f);:। यदि ऐसा है, तो आपके कोड में tableViewस्क्रॉल करने के लिए (0.0f, 5.0f)
टॉलगॉर्फ

25
मेरी पिछली टिप्पणी का हल:[tableView setContentOffset:CGPointMake(0.0f, -tableView.contentInset.top) animated:YES];
tolgamorf

3
IOS 11 पर आपको -scrollView.adjustedContentInset.topइसके बजाय उपयोग करने पर विचार करना चाहिए ।
मारीआन Marierný

79

संभावित कार्य:

1

func scrollToFirstRow() {
    let indexPath = NSIndexPath(forRow: 0, inSection: 0)
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
}

2

func scrollToLastRow() {
    let indexPath = NSIndexPath(forRow: objects.count - 1, inSection: 0)
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: true)
}

3

func scrollToSelectedRow() {
    let selectedRows = self.tableView.indexPathsForSelectedRows
    if let selectedRow = selectedRows?[0] as? NSIndexPath {
        self.tableView.scrollToRowAtIndexPath(selectedRow, atScrollPosition: .Middle, animated: true)
    }
}

4

func scrollToHeader() {
    self.tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)
}

5

func scrollToTop(){
    self.tableView.setContentOffset(CGPointMake(0,  UIApplication.sharedApplication().statusBarFrame.height ), animated: true)
}

शीर्ष पर स्क्रॉल करने में अक्षम करें:

func disableScrollsToTopPropertyOnAllSubviewsOf(view: UIView) {
    for subview in view.subviews {
        if let scrollView = subview as? UIScrollView {
            (scrollView as UIScrollView).scrollsToTop = false
        }
        self.disableScrollsToTopPropertyOnAllSubviewsOf(subview as UIView)
    }
}

आवश्यकता के अनुसार इसे संशोधित करें और उपयोग करें।

स्विफ्ट 4

  func scrollToFirstRow() {
    let indexPath = IndexPath(row: 0, section: 0)
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
  }

इस समाधान, संपूर्ण - स्क्रॉलटॉर्स्ट
मेहुल

बहुत बढ़िया सारांश। जब आपके पास अनुभाग हेडर हों तो आपको विकल्प 4 स्क्रॉलटेल का उपयोग करना होगा।
विंसेंट

टेबलव्यू के ऊपर एक खोज पट्टी तक स्क्रॉल करने का कोई तरीका है?
टायलर रट

27

NSIndexPath (खाली तालिका) का उपयोग न करना बेहतर है, न ही यह मानें कि शीर्ष बिंदु CGPointZero (सामग्री इनसेट) है, यही मैं उपयोग करता हूं -

[tableView setContentOffset:CGPointMake(0.0f, -tableView.contentInset.top) animated:YES];

उम्मीद है की यह मदद करेगा।


अब iOS 11 के रूप में मान्य नहीं है
rammdy

21

स्विफ्ट 4 :

यह बहुत अच्छी तरह से काम करता है:

//self.tableView.reloadData() if you want to use this line remember to put it before 
let indexPath = IndexPath(row: 0, section: 0)
self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)

3
यदि आपके टेबलव्यू में टेबलहेडर व्यू नहीं है और यह इनलाइन है (सामग्री के साथ स्क्रॉल)
फाइनेंशियलहैप

1
मेरे पास एक सादा और एक UITableViewStyleGrouped(सामग्री के साथ हेडर स्क्रॉल) दोनों हैं और यह कोड काम करता है। सुनिश्चित करें कि आप मुख्य थ्रेड में हैं और दृश्य दिखाई देने ( viewDidAppear) के बाद आप इस कोड को लॉन्च करते हैं । यदि आपको अभी भी समस्याएं हैं, तो इसके अंदर कोड डालने की कोशिश करें:DispatchQueue.main.asyncAfter(deadline: .now()+0.1, execute: { // the code }
एलेसेंड्रो ऑर्नानो

1
धन्यवाद। यह आपको पहली सेल में मिलेगा। हालाँकि, यह तालिका दृश्य शीर्ष लेख नहीं दिखाता है।
फिनेनीचेल्प

यदि किसी कारण से तालिका दृश्य खाली है तो यह विफल हो जाएगा (0 पंक्ति में 0 खंड में कोई सेल नहीं)
मैक्सिम स्क्रीबिन

17

मैंने एक समस्या का सामना करते हुए कुछ तरीकों को खाली करने की कोशिश की है tableView। यहां स्विफ्ट 4 के लिए एक और विकल्प है जो खाली टेबलव्यू को संभालता है।

extension UITableView {
  func hasRowAtIndexPath(indexPath: IndexPath) -> Bool {
    return indexPath.section < self.numberOfSections && indexPath.row < self.numberOfRows(inSection: indexPath.section)
  }

  func scrollToTop(animated: Bool) {
    let indexPath = IndexPath(row: 0, section: 0)
    if self.hasRowAtIndexPath(indexPath: indexPath) {
      self.scrollToRow(at: indexPath, at: .top, animated: animated)
    }
  }
}

उपयोग:

// from yourViewController or yourTableViewController
tableView.scrollToTop(animated: true)//or false

यह किसी भी तालिका शीर्षक या अनुभाग शीर्ष लेख के लिए खाता नहीं है।
rammdy

16

इसका उपयोग न करें

 tableView.setContentOffset(.zero, animated: true)

यह कभी-कभी अनुचित तरीके से ऑफसेट सेट कर सकता है। उदाहरण के लिए, मेरे मामले में, सेल वास्तव में सुरक्षित क्षेत्र के साथ दृश्य से थोड़ा ऊपर था। अच्छा नही।

INSTEAD का उपयोग

 tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)

1
सही समाधान।
बेबी

वास्तव में मैं क्या देख रहा था, धन्यवाद।
साइमन

इनमें से कोई भी समाधान मान्य नहीं हैं। पहला iOS 11 या उसके बाद काम नहीं करता है। यदि टेबल व्यू में टेबल हेडर है या दूसरा सेक्शन हेडर है तो दूसरा काम नहीं करता है जब तक कि आप वास्तव में शीर्ष पर पहली पंक्ति नहीं चाहते हैं और किसी भी हेडर को दिखाने की परवाह नहीं करते हैं।
rammdy

@ कामेडी सबसे अच्छा उपाय क्या है?
स्कॉट्टीब्लाड्स

15

IOS 11 पर, adjustedContentInsetइन-कॉल स्टेटस बार दिखाई देने या न होने पर दोनों मामलों के लिए शीर्ष पर सही ढंग से स्क्रॉल करने के लिए उपयोग करें।

if (@available(iOS 11.0, *)) {
    [tableView setContentOffset:CGPointMake(0, -tableView.adjustedContentInset.top) animated:YES];
} else {
    [tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:YES];
}

स्विफ्ट:

if #available(iOS 11.0, *) {
    tableView.setContentOffset(CGPoint(x: 0, y: -tableView.adjustedContentInset.top), animated: true)
} else {
    tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)
}

12

उन तालिकाओं के लिए contentInset, जिनकी सामग्री सेट करना ऑफसेट हैCGPointZero काम नहीं करेगा, उनके लिए। यह सामग्री शीर्ष बनाम तालिका शीर्ष पर स्क्रॉल करने के लिए स्क्रॉल करेगा।

खाते में सामग्री इनसेट लेने के बजाय यह पैदा करता है:

[tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:NO];

1
धन्यवाद, मैंने इसे CGPointZero पर सेट किया और समझ नहीं पाया कि ऐसा क्यों हो रहा था।
जॉन

अब iOS 11 के रूप में मान्य नहीं है
rammdy

10

यह कोड आपको शीर्ष पर एक विशिष्ट अनुभाग स्क्रॉल करने देता है

CGRect cellRect = [tableinstance rectForSection:section];
CGPoint origin = [tableinstacne convertPoint:cellRect.origin 
                                    fromView:<tableistance>];
[tableinstance setContentOffset:CGPointMake(0, origin.y)];

यह सबसे सरल कोड था और इसने ठीक काम किया। मैंने वास्तव में CGPointMake (0.0f, 0.0f) डाला। चीयर्स!
फेलिप

यह कोड धारा स्क्रॉल शीर्ष बनाने के लिए बहुत उपयोगी है
श्रीनिवास n

8

स्विफ्ट:

tableView.setContentOffset(CGPointZero, animated: true)

अब iOS 11 के रूप में मान्य नहीं है
rammdy

8

स्विफ्ट 3

tableView.setContentOffset(CGPoint.zero, animated: true)

अगर tableView.setContentOffset काम नहीं करते।

उपयोग:

tableView.beginUpdates()
tableView.setContentOffset(CGPoint.zero, animated: true)
tableView.endUpdates()

1
यह iOS 11 या उसके बाद के लिए मान्य नहीं है।
rammdy

7

चूंकि मेरी tableView सभी प्रकार के इनसेट से भरा हुआ है, यह एकमात्र ऐसी चीज़ थी जो अच्छी तरह से काम करती थी:

स्विफ्ट 3

if tableView.numberOfSections > 0 && tableView.numberOfRows(inSection: 0) > 0 {
  tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
}

स्विफ्ट 2

if tableView.numberOfSections > 0 && tableView.numberOfRowsInSection(0) > 0 {
  tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true)
}

यह मेरे लिए अधिक उपयोगी था
22

महान जवाब, इसकी सराहना करें
जेरेमी बैडर

7

पहले से बताई गई बातों को जोड़ते हुए, आप भविष्य में इसे आसान बनाने के लिए एक एक्सटेंशन (स्विफ्ट) या श्रेणी (ऑब्जेक्टिव C) बना सकते हैं:

स्विफ्ट:

extension UITableView {
    func scrollToTop(animated: Bool) {
        setContentOffset(CGPointZero, animated: animated)
    }
}

किसी भी समय आप किसी भी दिए गए तालिका दृश्य को शीर्ष पर स्क्रॉल करना चाहते हैं जिसे आप निम्नलिखित कोड कह सकते हैं:

tableView.scrollToTop(animated: true)

2
अब iOS 11 के रूप में मान्य नहीं है
rammdy

6

मैं निम्नलिखित को पसंद करता हूं, क्योंकि यह एक इनसेट को ध्यान में रखता है। यदि कोई इनसेट नहीं है, तो यह अभी भी शीर्ष पर स्क्रॉल करेगा क्योंकि इनसेट 0 होगा।

tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)

अब iOS 11 के रूप में मान्य नहीं है
rammdy

5

स्विफ्ट:

यदि आपके पास टेबल व्यू हेडर नहीं है:

tableView.setContentOffset(CGPointMake(0,  UIApplication.sharedApplication().statusBarFrame.height ), animated: true)

यदि ऐसा है तो :

tableView.setContentOffset(CGPointMake(0, -tableViewheader.frame.height   + UIApplication.sharedApplication().statusBarFrame.height ), animated: true)

5

स्विफ्ट 5, आईओएस 13

मुझे पता है कि इस प्रश्न के पहले से ही बहुत सारे उत्तर हैं लेकिन मेरे अनुभव से, केवल एक ही तरीका है जो हमेशा काम करता है:

tableView.scrollToRow(at: IndexPath(row: someArray.count - 1, section: 0), at: .bottom, animated: true)

यदि आप async में काम कर रहे हैं, तो कीबोर्ड आदि के साथ चेतन करने वाले टेबल, अन्य उत्तर अक्सर लगभग नीचे तक स्क्रॉल करेंगे , न कि पूर्ण नीचे। यह विधि आपको हर बार एक तालिका के पूर्ण अंत तक ले जाएगी।


आपको यह भी जांचना होगा कि क्या कोई खंड है
ओनुर टूना

4

आईओएस 11 पर सही ढंग से काम करने के लिए मैं यहां उपयोग कर रहा हूं:

extension UIScrollView {
    func scrollToTop(animated: Bool) {
        var offset = contentOffset
        if #available(iOS 11, *) {
            offset.y = -adjustedContentInset.top
        } else {
            offset.y = -contentInset.top
        }
        setContentOffset(offset, animated: animated)
    }
}

4

स्विफ्ट 5 में, धन्यवाद @ एड्रियन का जवाब बहुत कुछ

extension UITableView{

    func hasRowAtIndexPath(indexPath: IndexPath) -> Bool {
        return indexPath.section < numberOfSections && indexPath.row < numberOfRows(inSection: indexPath.section)
    }

    func scrollToTop(_ animated: Bool = false) {
        let indexPath = IndexPath(row: 0, section: 0)
        if hasRowAtIndexPath(indexPath: indexPath) {
            scrollToRow(at: indexPath, at: .top, animated: animated)
        }
    }

}

उपयोग:

tableView.scrollToTop()

2
1. यह स्विफ्ट 4 में भी मान्य है। 2. टेबल हेडर या सेक्शन हेडर होने पर यह काम नहीं करता है।
शाम

3

contentOffset का उपयोग करना सही तरीका नहीं है। यह बेहतर होगा क्योंकि यह टेबल व्यू का प्राकृतिक तरीका है

tableView.scrollToRow(at: NSIndexPath.init(row: 0, section: 0) as IndexPath, at: .top, animated: true)

2
यदि तालिका शीर्षक या अनुभाग शीर्ष लेख है तो यह काम नहीं करेगा।
rammdy

3

यह एकमात्र कोड स्निपेट था जो मेरे लिए काम करता था

स्विफ्ट 4:

    tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)
    tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
    tableView.setContentOffset(CGPoint(x: 0, y: -70), animated: true)

PS 70 मेरे हेडर और टेबल व्यू सेल की ऊंचाई है


शीर्ष पर स्क्रॉल करने के सही तरीके से यह बहुत दूर है। यह केवल सामग्री ऑफसेट सेट करने के लिए तीन अलग-अलग लाइनों का उपयोग करने के लिए कोई मतलब नहीं है। केवल अंतिम पंक्ति की जरूरत है लेकिन एक विशिष्ट ऑफसेट को हार्डकोड करना सही समाधान नहीं है।
rammdy

2
func scrollToTop() {
        NSIndexPath *topItem = [NSIndexPath indexPathForItem:0 inSection:0];
        [tableView scrollToRowAtIndexPath:topItem atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

जब भी आप UITableView स्क्रॉल करना चाहते हैं, तो इस फ़ंक्शन को कॉल करें


2

विस्तार के माध्यम से 4 स्विफ्ट , खाली तालिका दृश्य संभालती है:

extension UITableView {
    func scrollToTop(animated: Bool) {
        self.setContentOffset(CGPoint.zero, animated: animated);
    }
}

यह iOS 11 के रूप में मान्य नहीं है
rammdy

2

मैं tabBarController का उपयोग करता हूं और मेरे टैब में मेरे टेबलव्यू में कुछ खंड हैं, इसलिए यह मेरे लिए सबसे अच्छा समाधान है।

extension UITableView {

    func scrollToTop(){

        for index in 0...numberOfSections - 1 {
            if numberOfSections > 0 && numberOfRows(inSection: index) > 0 {
                scrollToRow(at: IndexPath(row: 0, section: index), at: .top, animated: true)
                break
            }

            if index == numberOfSections - 1 {
                setContentOffset(.zero, animated: true)
                break
            }
        }

    }

}

1

मुझे कई -1 *बार स्टेटस बार और नेविगेशन बार के योग से जोड़ना था , क्योंकि यह स्क्रीन से ऊँचाई तक जा रहा था,

self.tableView.setContentOffset(CGPointMake(0 , -1 * 
  (self.navigationController!.navigationBar.height +  
  UIApplication.sharedApplication().statusBarFrame.height) ), animated:true)

1

तेज में

अगर आपके पास सेट नहीं है, तो आपकी पंक्ति = SelectioncellRowNumber आपके अनुभाग में है

//UITableViewScrollPosition.Middle या नीचे या ऊपर

var lastIndex = NSIndexPath(forRow:  selectioncellRowNumber, inSection: selectionNumber)
self.tableView.scrollToRowAtIndexPath(lastIndex, atScrollPosition: UITableViewScrollPosition.Middle, animated: true)

1

यहां प्रोग्रामेटिकली टॉप करने के लिए स्क्रॉल करने योग्य कोड का कोड है

स्विफ्ट:

self.TableView.setContentOffset(CGPointMake(0, 1), animated:true)


0

यदि आप तालिका में मूव स्क्रॉल एनीमेशन चाहते हैं, तो इस कोड का उपयोग करें। स्क्रॉल .5 सेकंड में एनीमेशन के साथ शीर्ष पर जाता है।

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

[_tableContent scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];

[UIView commitAnimations];

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.