ইউআইটিএবলভিউ - শীর্ষে স্ক্রোল করুন


392

আমার টেবিল ভিউতে আমাকে শীর্ষে স্ক্রোল করতে হবে। তবে আমি গ্যারান্টি দিতে পারি না যে প্রথম অবজেক্টটি ধারা 0, সারি 0 হতে চলেছে May আমার টেবিলের ভিউটি 5 নং বিভাগ থেকে শুরু হবে।

সুতরাং আমি ব্যতিক্রম পাই, যখন আমি ফোন করি:

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

টেবিল দৃশ্যের শীর্ষে স্ক্রোল করার অন্য কোনও উপায় আছে কি?

উত্তর:


856

ইউআইটিএবলভিউ হ'ল ইউআইএসক্রোলভিউর একটি সাবক্লাস, সুতরাং আপনি এটি ব্যবহার করতে পারেন:

[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
আমি প্রথমে সিজিআরেক্টজেরো দিয়ে এটি চেষ্টা করেছি, যা সিজিআরেক্টমেকের (0, 0, 0, 0) সমান। এটি কাজ করে না, তবে অদ্ভুতভাবে উপরেরটি করে। আমার ধারণা এটির ইতিবাচক প্রস্থ এবং উচ্চতা প্রয়োজন needs ধন্যবাদ.
কেলার

5
দ্রষ্টব্য, আপনি অ্যানিমেটেড চাইবেন : আপনি যদি এটিকে স্ক্রোলটরোআউটইন্ডেক্সপথে চালান না: যাতে সারণিটি সঠিক অবস্থানে শুরু করা যায়। আশা করি এটা সাহায্য করবে!
ফ্যাটি

3
@ hasan83 সিজিআরেক্টমেক (0, 0, 0, 0) বা সিজিআরেক্টজেরো কোনও দৃশ্যমান রেকট নয়। আমি এও বলব যে [মূল টেবিলভিউ সেটকন্টেন্টঅফসেট: সিজিপয়েন্ট জিরো অ্যানিমেটেড: হ্যাঁ]; হ'ল সুন্দর অভিব্যক্তি।
Catlan

8
যে কেউ লক্ষ্য করেছে যে আইওএস 11-এ এই সমস্ত কিছু ভেঙে গেছে এবং কিছু ক্ষেত্রে সঠিকভাবে স্ক্রোল হচ্ছে না?
পিটার লাপিসু

11
@ পিটারলাপিসু self.tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.top, animated: true)আইওএস 11
জর্দান এস

246

দ্রষ্টব্য : এই উত্তরটি iOS 11 এবং তারপরের পরে বৈধ নয়।

আমি পছন্দ করি

[mainTableView setContentOffset:CGPointZero animated:YES];

যদি আপনার টেবিল ভিউতে শীর্ষস্থানীয় ইনসেট থাকে তবে আপনাকে এটিকে বিয়োগ করতে হবে:

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

12
টমেটো, টমেটো। হুম ... এটি লিখিতভাবে খুব স্পষ্টভাবে আসে না।
FreeAsInBeer

14
আপনি যখন টেবিল শিরোনাম বা পাদচরণের দৃশ্য দেখেন এবং সেগুলিও অন্তর্ভুক্ত করাতে চান এটি ব্যবহারের সেরা উপায়।
মাফোন্যা

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];
টোলগ্যামর্ফ

3
IOS 11 এ -scrollView.adjustedContentInset.topপরিবর্তে আপনার ব্যবহার বিবেচনা করা উচিত ।
মারিওন আর্নে

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

এনএসআইএনডেক্সপথ (খালি টেবিল) ব্যবহার না করা ভাল নয় বা ধরে নেওয়া উচিত না যে শীর্ষস্থানটি সিজিপয়েন্ট জিরো (সামগ্রী সামগ্রী), এটি আমি ব্যবহার করি -

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

আশাকরি এটা সাহায্য করবে.


আইওএস ১১ হিসাবে আর বৈধ নয়
rmaddy

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
যদি আপনার টেবিলভিউতে একটি টেবিলহাইডারভিউ থাকে এবং এটি ইনলাইন (বিষয়বস্তু সহ স্ক্রোলগুলি) নয়
Finneycanhelp

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

এটি কোনও সারণী শিরোনাম বা বিভাগের শিরোনামের জন্য অ্যাকাউন্ট করে না।
rmaddy

16

ব্যবহার করবেন না

 tableView.setContentOffset(.zero, animated: true)

এটি কখনও কখনও অসাধারণভাবে অফসেট সেট করতে পারে। উদাহরণস্বরূপ, আমার ক্ষেত্রে, ঘরটি নিরাপদ অঞ্চল পোকামাকড় সহ দৃশ্যটির থেকে কিছুটা উপরে ছিল। ভাল না.

ইনস্টল করুন

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

1
নিখুঁত সমাধান.
বেবি গ্রুট

ঠিক আমি যা খুঁজছিলাম, ধন্যবাদ।
সাইমন

এই সমাধানগুলির কোনওটিই বৈধ নয়। প্রথমটি আইওএস 11 এর অধীনে বা তার পরে কাজ করে না। দ্বিতীয়টি যদি কাজ করে না তবে টেবিল ভিউটিতে একটি টেবিল শিরোলেখ থাকে বা প্রথম বিভাগে বিভাগীয় শিরোনাম থাকে যদি না আপনি সত্যিই শীর্ষে প্রথম সারিটি না চান এবং কোনও শিরোনাম দেখানোর বিষয়ে চিন্তা করেন না।
rmaddy

@Rmaddy সবচেয়ে ভাল সমাধান কি?
স্কটিবিলেডস

15

আইওএস 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
আপনাকে ধন্যবাদ, আমি এটি সিজিপয়েন্ট জিরোতে সেট করে রেখেছি এবং কেন এটি হচ্ছে তা বুঝতে পারি না।
জনরেচড

আইওএস ১১ হিসাবে আর বৈধ নয়
rmaddy

10

এই কোডটি আপনাকে একটি নির্দিষ্ট বিভাগ শীর্ষে স্ক্রোল করতে দেয়

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

এটি ছিল সহজতম কোড এবং এটি ঠিক আছে। আমি প্রকৃতপক্ষে সিজিপিয়েন্টম্যানকে (0.0f, 0.0f) রেখেছি। চিয়ার্স!
ফিলিপ

এই বিভাগটি বিভাগটি শীর্ষে স্ক্রোল করতে খুব কার্যকর
শ্রিনিবাস n


8

সুইফট 3

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

যদি tableView.setContentOffsetকাজ না।

ব্যবহার করুন:

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

1
এটি আইওএস 11 বা তার পরে বৈধ নয়।
rmaddy 3'19

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)
}

এটি আমার জন্য আরও দরকারী ছিল
তেজরেতুল

দুর্দান্ত উত্তর, এটি প্রশংসা করুন
জেরেমি Bader

7

ইতিমধ্যে যা বলা হয়েছে তাতে যুক্ত করে ভবিষ্যতে এটিকে আরও সহজ করতে আপনি একটি এক্সটেনশন (সুইফট) বা বিভাগ (উদ্দেশ্য সি) তৈরি করতে পারেন:

সুইফট:

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

আপনি যে কোনও সময় কোনও প্রদত্ত টেবিলভিউ শীর্ষে স্ক্রোল করতে চান আপনি নীচের কোডটিতে কল করতে পারেন:

tableView.scrollToTop(animated: true)

2
আর বৈধ আইওএস 11. হিসাবে
rmaddy

6

আমি নিম্নলিখিতটি পছন্দ করি কারণ এটি কোনও ইনসেট বিবেচনায় নেয়। যদি কোনও ইনসেট না থাকে তবে ইনসেটটি 0 হবে এটি এখনও শীর্ষে স্ক্রোল করবে।

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

আইওএস ১১ হিসাবে আর বৈধ নয়
rmaddy 3'19

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)

আপনি যদি অ্যাসিঙ্ক, কী-বোর্ড ইত্যাদির সাহায্যে সারণীগুলি ইত্যাদিতে কাজ করছেন তবে অন্যান্য উত্তরগুলি প্রায়শই নীচের দিকে নয়, প্রায় নীচে চলে যায়। এই পদ্ধতিটি আপনাকে প্রতিবার একটি টেবিলের পরম প্রান্তে পৌঁছে দেবে।


আপনার কোনও বিভাগ আছে কিনা তাও পরীক্ষা করে দেখতে হবে
ওনুর টুনা

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.
rmaddy 3'19

3

কন্টেন্টঅফসেট ব্যবহার করা সঠিক উপায় নয়। এটি আরও ভাল হবে কারণ এটি টেবিল দেখার প্রাকৃতিক উপায়

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

2
কোনও সারণী শিরোনাম বা বিভাগ শিরোনাম থাকলে এটি কাজ করবে না।
rmaddy 3'19

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)

পিএস 70 হ'ল আমার শিরোনাম এবং টেবিল ভিউ ঘরের উচ্চতা


এটি শীর্ষে স্ক্রোল করার সঠিক উপায় থেকে অনেক দূরে। কেবলমাত্র সামগ্রীটি অফসেট সেট করতে তিনটি পৃথক লাইন ব্যবহার করা কোনও অর্থবোধ করে না। শুধুমাত্র শেষ লাইনের প্রয়োজন তবে নির্দিষ্ট অফসেটের হার্ডকোডিং সঠিক সমাধান নয়।
rmaddy

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

আপনি যেখানে ইউআইটিএবলভিউ স্ক্রোলটি চান সেখানে এই ফাংশনটি কল করুন


2

এক্সটেনশনের মাধ্যমে সুইফট 4 খালি সারণী দর্শন পরিচালনা করে:

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

এই আইওএস 11. হিসাবে বৈধ নয়
rmaddy

2

আমি ট্যাববারকন্ট্রোলার ব্যবহার করি এবং প্রতিটি ট্যাবে আমার টেবিলভিউতে আমার কয়েকটি বিভাগ থাকে, সুতরাং এটি আমার পক্ষে সেরা সমাধান।

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

দ্রুত

আপনার সারি = সিলেকশনসেল রোল আপনার বিভাগটি কম করুন যদি আপনার কাছে = নির্বাচন নম্বর থাকে তবে আপনি সেট না করে থাকলে শূন্য হয়

// ইউআইটিএবল ভিউস্ক্রোলপজিশন.মিল্ড বা নীচে বা শীর্ষ

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];

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.