ইউআইএসক্রোলভিউ প্রোগ্রামমেটিকভাবে নীচে স্ক্রোল করুন


298

আমি কীভাবে UIScrollViewআমার কোডের নীচে স্ক্রোল তৈরি করতে পারি ? বা আরও সাধারণ উপায়ে, একটি সংক্ষিপ্তসার কোনও বিন্দুতে?

উত্তর:


626

setContentOffset:animated:কন্টেন্ট ভিউয়ের যে কোনও অংশে স্ক্রোল করতে আপনি ইউআইএসক্রোলভিউয়ের ফাংশনটি ব্যবহার করতে পারেন । এখানে কিছু কোড যা নীচের দিকে স্ক্রোল করুন করবে, আপনার scrollView অভিমানী হয় self.scrollView:

CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];

আশা করি এইটি কাজ করবে!


25
আপনি সম্ভবত নিম্নলিখিতটি স্ক্রোলভিউয়ের পরিবর্তে নীচে স্ক্রোল করতে চান: সিজিপয়েন্ট তলদেশ অফসেট = সিজিপিয়েন্টম্যান্ট (0, [স্বতঃস্ক্রোলভিউ কন্টেন্টসাইজ]। উচ্চতা - সেল্ফ.স্রোকলভিউ.ফ্রেম.সাইজ.হাইট);
গ্রান্টল্যান্ড চিউ

70
আপনার পোকামাকড়গুলি অ্যাকাউন্টে নেওয়া হচ্ছে না। আমার মনে হয় আপনার এই নীচে অফসেটটি পছন্দ করা উচিত:CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
মার্টিন

1
এটি ল্যান্ডস্কেপ মোডে কাজ করে না! পুরোপুরি নীচে স্ক্রোল করা হয়নি
মো ফারহ্যান্ড

1
এর contentSizeচেয়ে কম হলে এটি সঠিকভাবে কাজ করবে না bounds। সুতরাং এটি এর মতো হওয়া উচিত:scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0) ), animated: true)
বার্তোমিয়েজ সেমাসেকেক

1
এটি নীচের let bottomOffsetY = max(collectionView.contentSize.height - collectionView.bounds.height + collectionView.contentInset.bottom, 0)
ইনসেটটি

136

সহজ অনুলিপি পেস্ট করার জন্য গৃহীত উত্তরের সুইফ্ট সংস্করণ:

let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height)
scrollView.setContentOffset(bottomOffset, animated: true)

3
ডাউনঅফসেটটি আপনার উদাহরণে পরিবর্তিত হওয়া উচিত।
হবিস দ্য টাইগ

সত্য, এটি পরিবর্তন। সুইফট 2 স্টাফ :)
এসকরোথ

9
আপনার যদি স্ক্রোলভিউ.কন্টেন্টসাইজ.হাইট - স্ক্রোলভিউ.বাউন্ডস.সাইটি.হাইট> 0 যাচাই করা দরকার তবে অন্যথায় আপনার আরও খারাপ ফলাফল হবে
iluvatar_GR

2
আপনার যখন নতুন নেভিগেশন বার থাকবে তখন এই সমাধানটি নিখুঁত নয়।
সুইফট খরগোশ

@ জোশ, এখনও সেই দিনের অপেক্ষায় রয়েছেন যে কোনও এসও এটির সন্ধান করে
আলেকজান্দ্রে জি

53

সহজ সমাধান:

[scrollview scrollRectToVisible:CGRectMake(scrollview.contentSize.width - 1,scrollview.contentSize.height - 1, 1, 1) animated:YES];

ধন্যবাদ। আমি ভুলে গিয়েছি আমি আমার স্ক্রোলভিউটি একটি ইউআইটিএবলভিতে পরিবর্তন করেছি এবং এই কোডটি একটি ইউআইটিএবলভিউয়ের জন্যও কাজ করেছে, এফওয়াইআই।
লেভিনসনটেকনোলজিস

1
শুধু কেন নয়: [স্ক্রোলভিউ স্ক্রোলরেক্টটওভিজিবল: সিজিআরেক্টমেক (0, স্ক্রোলভিউ.কন্টেন্টসাইজ.হাইট, 1, 1) অ্যানিমেটেড: হ্যাঁ];
জোহানেস

29

বিদ্যমান উত্তরের জন্য কেবল একটি বর্ধন।

CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];

এটি নীচের ইনসেটটিরও যত্ন নেয় (আপনি যদি কীবোর্ডটি দৃশ্যমান থাকে তখন আপনার স্ক্রোল ভিউ সামঞ্জস্য করতে এটি ব্যবহার করছেন)


এটি সঠিক উত্তর হওয়া উচিত ... অন্যগুলি নয় যা যদি কখনও কীবোর্ড পপ আপ হয় তবে ভেঙে যায়।
বেন গিল্ড

19

সামগ্রীটিকে আকারের উচ্চতায় অফসেট সেট করা ভুল: এটি সামগ্রীর নীচের অংশে শীর্ষে স্ক্রোল করে স্ক্রোল দৃশ্যের স্ক্রোল করে এবং এভাবে দৃষ্টির বাইরে।

সঠিক সমাধানটি হ'ল লিখিত সামগ্রীর নীচের অংশে স্ক্রোল ভিউয়ের নীচে স্ক্রোল করা ( svএটি হল ইউআইএসক্রোলভিউ):

CGSize csz = sv.contentSize;
CGSize bsz = sv.bounds.size;
if (sv.contentOffset.y + bsz.height > csz.height) {
    [sv setContentOffset:CGPointMake(sv.contentOffset.x, 
                                     csz.height - bsz.height) 
                animated:YES];
}

1
এটা করা উচিত নয় if (sv.contentOffset.y + csz.height > bsz.height) {?
আই_আম_জোরফ

@ জেফামফোন - জিজ্ঞাসা করার জন্য ধন্যবাদ। আসলে এই মুহুর্তে আমি নিশ্চিতও না যে শর্তটি কী উদ্দেশ্যে করার কথা ছিল! এটি setContentOffset:গুরুত্বপূর্ণ কমান্ড।
ম্যাট

আমি সেটেন্টট্যান্সফেস কলটি এড়াতে এটির জন্য কিছু মনে করি না যদি তা অনুমান করি?
i_am_jorf

@ জেফামফোন - এটি ব্যবহৃত হত যে ডিভাইস ঘোরার পরে একটি স্ক্রোল ভিউ তার সামগ্রীর ফ্রেমের নীচে থেকে নীচে দিয়ে শেষ হতে পারে (কারণ আমরা যদি কোনও স্ক্রল ঘুরিয়ে দেখি তবে এর সামগ্রীটি অফসেট স্থির থাকে, তবে স্ক্রোল দর্শন উচ্চতার কারণে বেড়ে যেতে পারে to autoresizing)। শর্তটি বলে: যদি এটি হয় তবে সামগ্রীটির নীচের অংশটি ফ্রেমের নীচে রেখে দিন। আমি কোডটিতে আটকানোর সময় শর্তটি অন্তর্ভুক্ত করা আমার কাছে বোকামিপূর্ণ ছিল। শর্ত হয় সঠিকভাবে যদিও এটা কি জন্য পরীক্ষা ছিল পরীক্ষা।
ম্যাট

19

একটি দ্রুত বাস্তবায়ন:

extension UIScrollView {
   func scrollToBottom(animated: Bool) {
     if self.contentSize.height < self.bounds.size.height { return }
     let bottomOffset = CGPoint(x: 0, y: self.contentSize.height - self.bounds.size.height)
     self.setContentOffset(bottomOffset, animated: animated)
  }
}

এটা ব্যবহার করো:

yourScrollview.scrollToBottom(animated: true)

15

একটি দ্রুতগতি 2.2 সমাধান, গ্রহণ contentInsetএকাউন্টে

let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)

এটি একটি এক্সটেনশনে হওয়া উচিত

extension UIScrollView {

  func scrollToBottom() {
    let bottomOffset = CGPoint(x: 0, y: contentSize.height - bounds.size.height + contentInset.bottom)
    setContentOffset(bottomOffset, animated: true)
  }
}

নোট করুন যে আপনি bottomOffset.y > 0স্ক্রোলের আগে পরীক্ষা করতে চাইতে পারেন



13

উপরে যান

- CGPoint topOffset = CGPointMake(0, 0);
- [scrollView setContentOffset:topOffset animated:YES];

নীচে স্ক্রোল করুন

- CGPoint bottomOffset = CGPointMake(0, scrollView.contentSize.height - self.scrollView.bounds.size.height);
 - [scrollView setContentOffset:bottomOffset animated:YES];

7

আপনি যদি ইউআইটিএবল ভিউ (যা ইউআইএসক্রোলভিউয়ের একটি উপশ্রেণী) ব্যবহার করছেন সে ক্ষেত্রে এটি করার আরও একটি কার্যকর উপায়ও পেয়েছি:

[(UITableView *)self.view scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

এফওয়াইআই, এটি কেবল একটি ইউআইটিএবলভিউ দক্ষতা
ওহাদএম

7

সুইফটে setContentOffset:animated:নীচে স্ক্রোল করতে ইউআইএসক্রোলভিউয়ের ক্রিয়া ব্যবহার করা ।

let bottomOffset : CGPoint = CGPointMake(0, scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)

5

দেখে মনে হচ্ছে এখানকার সমস্ত উত্তর নিরাপদ অঞ্চলটিকে বিবেচনায় নেয় নি। আইওএস ১১-এর পর থেকে, আইফোন এক্সের একটি নিরাপদ অঞ্চল চালু হয়েছিল। এটি স্ক্রোলভিউগুলিকে প্রভাবিত করতে পারে contentInset

আইওএস 11 এবং ততোধিক বিষয়বস্তুতে অন্তর্ভুক্ত সামগ্রী অন্তর্ভুক্ত সহ সঠিকভাবে নীচে স্ক্রোল করতে। এর adjustedContentInsetপরিবর্তে আপনার ব্যবহার করা উচিত contentInset। এই কোডটি পরীক্ষা করুন:

  • সুইফট:
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.height + scrollView.adjustedContentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)
  • উদ্দেশ্য গ
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.adjustedContentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];
  • সুইফট এক্সটেনশন (এটি মূলটি রাখে contentOffset.x):
extension UIScrollView {
    func scrollsToBottom(animated: Bool) {
        let bottomOffset = CGPoint(x: contentOffset.x,
                                   y: contentSize.height - bounds.height + adjustedContentInset.bottom)
        setContentOffset(bottomOffset, animated: animated)
    }
}

তথ্যসূত্র:


5

একটি (alচ্ছিক) footerViewএবং contentInsetএর সাথে সমাধানটি হ'ল:

CGPoint bottomOffset = CGPointMake(0, _tableView.contentSize.height - tableView.frame.size.height + _tableView.contentInset.bottom);
if (bottomOffset.y > 0) [_tableView setContentOffset: bottomOffset animated: YES];

4

সুইফট:

আপনি এর মতো এক্সটেনশন ব্যবহার করতে পারেন:

extension UIScrollView {
    func scrollsToBottom(animated: Bool) {
        let bottomOffset = CGPoint(x: 0, y: contentSize.height - bounds.size.height)
        setContentOffset(bottomOffset, animated: animated)
    }
}

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

scrollView.scrollsToBottom(animated: true)

3

ভাল্ডার, আশা করি এটি আপনাকে সহায়তা করবে:

CGPoint bottomOffset = CGPointMake(0, [textView contentSize].height - textView.frame.size.height);

if (bottomOffset.y > 0)
 [textView setContentOffset: bottomOffset animated: YES];

2

বিভাগ উদ্ধার!

এটিকে কোনও অংশীদারি ইউটিলিটি শিরোনামে যুক্ত করুন:

@interface UIScrollView (ScrollToBottom)
- (void)scrollToBottomAnimated:(BOOL)animated;
@end

এবং তারপরে সেই ইউটিলিটি বাস্তবায়নের জন্য:

@implementation UIScrollView(ScrollToBottom)
- (void)scrollToBottomAnimated:(BOOL)animated
{
     CGPoint bottomOffset = CGPointMake(0, self.contentSize.height - self.bounds.size.height);
     [self setContentOffset:bottomOffset animated:animated];
}
@end

তারপরে আপনি যেখানে চান সেখানে এটি প্রয়োগ করুন:

[[myWebView scrollView] scrollToBottomAnimated:YES];

সর্বদা, সর্বদা, সর্বদা, সর্বদা বিভাগ ব্যবহার করুন! পারফেক্ট :)
ফ্যাটি

2

অনুভূমিক স্ক্রোলভিউয়ের জন্য

আপনি যদি আমার পছন্দ করেন তবে আমার একটি অনুভূমিক স্ক্রোলভিউ রয়েছে এবং এর শেষের দিকে স্ক্রোল করতে চান (আমার ক্ষেত্রে এটির ডানদিকে) আপনার গ্রহণযোগ্য উত্তরের কিছু অংশ পরিবর্তন করতে হবে:

উদ্দেশ্য গ

CGPoint rightOffset = CGPointMake(self.scrollView.contentSize.width - self.scrollView.bounds.size.width + self.scrollView.contentInset.right, 0 );
[self.scrollView setContentOffset:rightOffset animated:YES];

দ্রুতগতি

let rightOffset: CGPoint = CGPoint(x: self.scrollView.contentSize.width - self.scrollView.bounds.size.width + self.scrollView.contentInset.right, y: 0)
self.scrollView.setContentOffset(rightOffset, animated: true)

2

যদি আপনি কোনওভাবে স্ক্রোলভিউ কন্টেন্টসাইজ পরিবর্তন করেন (উদাহরণস্বরূপ স্ক্রোলভিউয়ের অভ্যন্তরে স্ট্যাকভিউতে কিছু যুক্ত করুন) আপনাকে অবশ্যই কল করতে হবেscrollView.layoutIfNeeded() স্ক্রোলিংয়ের আগে , অন্যথায় এটি কিছুই করে না।

উদাহরণ:

scrollView.layoutIfNeeded()
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
if(bottomOffset.y > 0) {
    scrollView.setContentOffset(bottomOffset, animated: true)
}

1

আপনার সামগ্রীর নীচের অংশটি দৃশ্যমান তা নিশ্চিত করার একটি ভাল উপায় হ'ল সূত্রটি ব্যবহার করা:

contentOffsetY = MIN(0, contentHeight - boundsHeight)

এটি নিশ্চিত করে যে আপনার সামগ্রীর নীচের প্রান্তটি সর্বদা দেখার নীচের প্রান্তে বা তার উপরে থাকবে। MIN(0, ...)প্রয়োজন বোধ করা হয় কারণ UITableView(এবং সম্ভবত UIScrollView) নিশ্চিত contentOffsetY >= 0তখন ব্যবহারকারী চেষ্টা দৃশ্যত snapping দ্বারা স্ক্রোল করতেcontentOffsetY = 0 । এটি ব্যবহারকারীর কাছে বেশ অদ্ভুত দেখাচ্ছে।

এটি বাস্তবায়নের কোডটি হ'ল:

UIScrollView scrollView = ...;
CGSize contentSize = scrollView.contentSize;
CGSize boundsSize = scrollView.bounds.size;
if (contentSize.height > boundsSize.height)
{
    CGPoint contentOffset = scrollView.contentOffset;
    contentOffset.y = contentSize.height - boundsSize.height;
    [scrollView setContentOffset:contentOffset animated:YES];
}


1

Mattসমাধানটি আমার কাছে সঠিক বলে মনে হলেও আপনার যদি সেট আপ করা থাকে তবে সংগ্রহ ভিউ ইনসেটটিও অ্যাকাউন্টে নেওয়া দরকার।

অভিযোজিত কোডটি হ'ল:

CGSize csz = sv.contentSize;
CGSize bsz = sv.bounds.size;
NSInteger bottomInset = sv.contentInset.bottom;
if (sv.contentOffset.y + bsz.height + bottomInset > csz.height) {
    [sv setContentOffset:CGPointMake(sv.contentOffset.x, 
                                     csz.height - bsz.height + bottomInset) 
                animated:YES];
}

1

দ্রুত:

   if self.mainScroll.contentSize.height > self.mainScroll.bounds.size.height {
        let bottomOffset = CGPointMake(0, self.mainScroll.contentSize.height - self.mainScroll.bounds.size.height);
        self.mainScroll.setContentOffset(bottomOffset, animated: true)
    }

1

কোনও টেবিলের শেষ আইটেমে স্ক্রোল করার সমাধান দেখুন:

সুইফট 3:

if self.items.count > 0 {
        self.tableView.scrollToRow(at:  IndexPath.init(row: self.items.count - 1, section: 0), at: UITableViewScrollPosition.bottom, animated: true)
}

0

আমার জন্য কাজ না করে, যখন আমি এটি ব্যবহার করার চেষ্টা UITableViewControllerউপর self.tableView (iOS 4.1), যোগ করার পরেfooterView । এটি কালো স্ক্রিন দেখিয়ে সীমানার বাইরে স্ক্রোল করে।

বিকল্প সমাধান:

 CGFloat height = self.tableView.contentSize.height; 

 [self.tableView setTableFooterView: myFooterView];
 [self.tableView reloadData];

 CGFloat delta = self.tableView.contentSize.height - height;
 CGPoint offset = [self.tableView contentOffset];
 offset.y += delta;

 [self.tableView setContentOffset: offset animated: YES];

0
CGFloat yOffset = scrollView.contentOffset.y;

CGFloat height = scrollView.frame.size.height;

CGFloat contentHeight = scrollView.contentSize.height;

CGFloat distance = (contentHeight  - height) - yOffset;

if(distance < 0)
{
    return ;
}

CGPoint offset = scrollView.contentOffset;

offset.y += distance;

[scrollView setContentOffset:offset animated:YES];

0

আমি খুঁজে পেয়েছি যে contentSizeপাঠ্যের প্রকৃত আকারটি সত্যিই প্রতিফলিত করে না, তাই নীচে স্ক্রোল করার চেষ্টা করার সময় এটি কিছুটা বন্ধ হয়ে যাবে। আসল সামগ্রীর আকার নির্ধারণের সেরা উপায়টি আসলে NSLayoutManagerএর usedRectForTextContainer:পদ্ধতিটি ব্যবহার করা :

UITextView *textView;
CGSize textSize = [textView.layoutManager usedRectForTextContainer:textView.textContainer].size;

প্রকৃতপক্ষে কতটা পাঠ্য দেখানো হয়েছে তা নির্ধারণ UITextViewকরতে, আপনি ফ্রেমের উচ্চতা থেকে পাঠ্য ধারক ইনসেটগুলি বিয়োগ করে এটি গণনা করতে পারেন।

UITextView *textView;
UIEdgeInsets textInsets = textView.textContainerInset;
CGFloat textViewHeight = textView.frame.size.height - textInsets.top - textInsets.bottom;

তারপরে স্ক্রোল করা সহজ হয়ে যায়:

// if you want scroll animation, use contentOffset
UITextView *textView;
textView.contentOffset = CGPointMake(textView.contentOffset.x, textSize - textViewHeight);

// if you don't want scroll animation
CGRect scrollBounds = textView.bounds;
scrollBounds.origin = CGPointMake(textView.contentOffset.x, textSize - textViewHeight);
textView.bounds = scrollBounds;

বিভিন্ন আকারগুলি খালি জন্য কী উপস্থাপন করে সে বিষয়ে রেফারেন্সের জন্য কয়েকটি সংখ্যা UITextView

textView.frame.size = (width=246, height=50)
textSize = (width=10, height=16.701999999999998)
textView.contentSize = (width=246, height=33)
textView.textContainerInset = (top=8, left=0, bottom=8, right=0)

0

স্ক্রোলটোবোটম পদ্ধতি যুক্ত করতে ইউআইএসক্রোলভিউ প্রসারিত করুন:

extension UIScrollView {
    func scrollToBottom(animated:Bool) {
        let offset = self.contentSize.height - self.visibleSize.height
        if offset > self.contentOffset.y {
            self.setContentOffset(CGPoint(x: 0, y: offset), animated: animated)
        }
    }
}

এটি বিদ্যমান উত্তরের সাথে কী যুক্ত করে?
গ্রেইবার্ড

-1

গৃহীত উত্তরের Xamarin.iOS সংস্করণ

var bottomOffset = new CGPoint (0,
     scrollView.ContentSize.Height - scrollView.Frame.Size.Height
     + scrollView.ContentInset.Bottom);

scrollView.SetContentOffset (bottomOffset, false);

-1

UICollectionViewঅনুলিপি এবং আটকানোতে স্বাচ্ছন্দ্যের জন্য গৃহীত উত্তরের Xamarin.iOS সংস্করণ

var bottomOffset = new CGPoint (0, CollectionView.ContentSize.Height - CollectionView.Frame.Size.Height + CollectionView.ContentInset.Bottom);          
CollectionView.SetContentOffset (bottomOffset, false);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.