শীর্ষে স্ক্রোল করতে ইউআইএসক্রোলভিউ পান


উত্তর:


316

আইওএস 7 এর জন্য আপডেট করুন

[self.scrollView setContentOffset:
    CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];

মূল

[self.scrollView setContentOffset:CGPointZero animated:YES];

অথবা আপনি যদি অনুভূমিক স্ক্রোল অবস্থানটি সংরক্ষণ করতে চান এবং কেবল উল্লম্ব অবস্থানটি পুনরায় সেট করতে চান:

[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, 0)
    animated:YES];

50
আপনি যদি আইওএস 7 এর জন্য এটি করছেন তবে UIScrollView contentInsetদুর্ভাগ্যক্রমে আপনাকে অ্যাকাউন্টটি গ্রহণ করতে হতে পারে । [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];আমার জন্য কাজটি করে
রানমাদ

11
আমি নেভিগেশন এবং স্ট্যাটাস বারের ঠিক নীচে উপরে স্ক্রোল করতে সক্ষম হয়েছি। [scrollView setContentOffset:CGPointMake(0, -scrollView.contentInset.top) animated:YES];এটি আইওএস 6 এবং 7
এম্পোজস

এটি আমার পক্ষে কার্যকর হয়নি কারণ সম্ভবত স্প্রিট কিটে একটি উল্টানো দৃষ্টিভঙ্গি নিয়ে আমি পাগল কিছু করছি। তবে অন্য কেউ যদি আমার মতো পাগল হয় - এবং আপনার [scrollView setContentOffset:CGPointMake(0, scrollView.contentSize.height-scrollView.frame.size.height) animated:YES];
স্ক্রোলভিউটি

দেরিতে-ইন-মন্তব্য: ওএস সংস্করণ নির্বিশেষে আপনার সামগ্রীর ইনসেটের জন্য সামঞ্জস্য করা উচিত। আইওএস 7 স্ট্যাটাস বারের নীচে স্ক্রোল সামগ্রীতে অনুমতি দেওয়ার জন্য এটি ব্যবহার করে তবে এটি সর্বদা সম্পত্তি হিসাবে প্রকাশিত হয়, তাই সর্বদা কারও দ্বারা সম্ভাব্যভাবে ব্যবহৃত হয়।
টমি

2
আইওএস 11+ এর জন্য, অ্যাডজাস্টকন্টেন্টসেন্ট ব্যবহার করে নীচে জাকুব ট্রুহলির উত্তরটি আমার পক্ষে অন্তত সহায়ক ছিল।
tnev

61

এখানে একটি সুইফট এক্সটেনশন যা এটি সহজ করে তোলে:

extension UIScrollView {
    func scrollToTop() {
        let desiredOffset = CGPoint(x: 0, y: -contentInset.top)
        setContentOffset(desiredOffset, animated: true)
   }
}

ব্যবহার:

myScrollView.scrollToTop()

40

iOS 11 এবং তারপরে

নতুন সঙ্গে কাজ করার চেষ্টা করুন adjustedContentInset

উদাহরণস্বরূপ (শীর্ষে স্ক্রোল):

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)

আপনি ব্যবহার এমনকি যদি prefersLargeTitles, safe areaইত্যাদি




17

সুইফট 2.0 / 3.0 / 4.0 এবং iOS 7+ এর জন্য উত্তর:

let desiredOffset = CGPoint(x: 0, y: -self.scrollView.contentInset.top)
self.scrollView.setContentOffset(desiredOffset, animated: true)

8

আইওএস 7-তে আমি শীর্ষে যেতে একটি নির্দিষ্ট স্ক্রোলভিউ পেতে সমস্যা পেয়েছিলাম, যা আইওএস 6-এ কাজ করেছিল এবং শীর্ষে যেতে স্ক্রোলভিউ সেট করতে এটি ব্যবহার করেছে।

[self.myScroller scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];

আইওএস 7 এও আমার একই সমস্যা আছে। ইউআইটিএবলভিউয়ের জন্য কীভাবে এটি সক্ষম করবেন কেউ জানেন?
DZenBot

1
এটি মজার বিষয় যখন অ্যানিমেটেড কোনও হয় না তবে এটি কীভাবে কাজ করে তবে এনিমেটেড হ্যাঁ হয় না। যদি হ্যাঁ, তবে এটি প্রায় শীর্ষদেহে জিএম 16
ম্যাট বেকার


2

স্ট্যাটাস বারের স্ক্রোলটপ টপ আচরণ সম্পূর্ণরূপে প্রতিলিপি করতে আমাদের কেবল কন্টেন্টঅফসেট সেট করতে হবে তা নয়, এটিও নিশ্চিত করতে চাই যে স্ক্রোলইন্ডিসেটর প্রদর্শিত হয়েছে। অন্যথায় ব্যবহারকারী দ্রুত হারিয়ে যেতে পারে।

এটি সম্পাদন করার একমাত্র পাবলিক পদ্ধতি flashScrollIndicators। দুর্ভাগ্যক্রমে, কন্টেন্টঅফসেটটি সেট করার পরে একবার এটি কল করার কোনও প্রভাব নেই কারণ তা অবিলম্বে পুনরায় সেট হয়ে যায়। আমি প্রতিটি বার ফ্ল্যাশ করার সময় এটি কাজ করে দেখতে পেলাম 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;
    });
}

আপনার ইউআইএসক্রোলভিউ ডেলেগেটে (বা ইউআইটিএবেবল / ইউআইসি কলিকেশনভিউডেলিগেট) এটিকে প্রয়োগ করুন:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.tag == SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG) {
        [scrollView flashScrollIndicators];
    }
}

স্ট্যাটাস বারের স্ক্রোলটপ টপ আচরণের তুলনায় আড়াল করার বিলম্বটি কিছুটা ছোট but তবে এটি এখনও দুর্দান্ত দেখাচ্ছে।

নোট করুন যে আমি "ইসক্রলিংটোটপ" রাষ্ট্রের সাথে যোগাযোগ করার জন্য ভিউ ট্যাগটিকে অপব্যবহার করছি কারণ আমার দেখার নিয়ামকগুলিতে আমার এটির প্রয়োজন। আপনি যদি অন্য কোনও কিছুর জন্য ট্যাগ ব্যবহার করে থাকেন তবে আপনি এটি আইভার বা কোনও সম্পত্তি দিয়ে প্রতিস্থাপন করতে পারেন might


আমি পরীক্ষা করিনি, তবে আপনি যদি এর পরিবর্তে কেবল DISPATCH_TIME_NOW ব্যবহার করেন তবে এটি পরবর্তী রানলুপে ফেলে দেওয়া উচিত। এই কাজটি করার জন্য ধন্যবাদ, আমার এখনও এটি প্রয়োজন তা নিশ্চিত নয়, তবে জানা ভাল।
ড্যান রোজনস্টার্ক

এটি কিছুক্ষণ আগে এবং আমার ঠিক মনে নেই তবে আমি বিশ্বাস করি এটি কার্যকর হয়নি। পরের রানলুপটিকে উল্লেখ করা সাধারণত আমি প্রথমে এ জাতীয় ক্ষেত্রে চেষ্টা করি।
অর্টউইন জেন্টজ

2

আমি মনে করি আমার কাছে একটি উত্তর আছে যা আইওএস 11 এর সাথে পূর্ববর্তী সংস্করণগুলির সাথে (উল্লম্ব স্ক্রোলিংয়ের জন্য) পুরোপুরি সামঞ্জস্যপূর্ণ হওয়া উচিত

এটি নতুন অ্যাডজাস্টেড কনটেন্টইনসেটকে অ্যাকাউন্টে গ্রহণ করে এবং যখন নেভিগেশনবারে PreferLargeTitles সক্ষম করা থাকে তখন প্রয়োজনীয় অতিরিক্ত অফসেটের জন্যও অ্যাকাউন্ট লাগে যা ডিফল্ট যাই হোক না কেন তার উপরে অতিরিক্ত 52px অফসেটের প্রয়োজন বলে মনে হয়

এটি কিছুটা জটিল ছিল কারণ শিরোনামবারের অবস্থার উপর ভিত্তি করে অ্যাডজাস্টড কনটেন্টইনসেট পরিবর্তিত হয় (বড় শিরোনাম বনাম ছোট শিরোনাম) সুতরাং শিরোনামবারের উচ্চতাটি কী ছিল তা পরীক্ষা করে দেখার দরকার ছিল এবং 52px অফসেটটি যদি এর আগে থেকেই বড় অবস্থায় থাকে তবে তা প্রয়োগ করতে পারি না। নেভিগেশনবারের অবস্থাটি যাচাই করার জন্য অন্য কোনও পদ্ধতি খুঁজে পাওয়া যায় নি তাই উচ্চতা> ৪৪.০ আছে কিনা তা দেখার চেয়ে কারও কাছে যদি আরও ভাল বিকল্প থাকে তবে আমি এটি শুনতে চাই

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

জাকুব এর সমাধান দ্বারা অনুপ্রাণিত


2

এটি খুব সাধারণ যখন আপনার নেভিগেশন বারটি স্ক্রোলভিউ সামগ্রীর ছোট্ট অংশটিকে ওভারল্যাপ করে এবং দেখে মনে হয় বিষয়বস্তু উপরের দিক থেকে শুরু হয় না। এটি ঠিক করার জন্য আমি 2 টি কাজ করেছি:

  • আকার পরিদর্শক - স্ক্রোল দেখুন - সামগ্রী কীটপতঙ্গ -> স্বয়ংক্রিয় থেকে কখনই পরিবর্তন করুন।
  • আকার পরিদর্শক - সীমাবদ্ধতা- "শীর্ষে সারিবদ্ধ করুন" (শীর্ষ প্রান্তিককরণের সীমাবদ্ধতা) - দ্বিতীয় আইটেম -> সুপারভিউ থেকে পরিবর্তন করুন শীর্ষস্থান থেকে শীর্ষে। শীর্ষে এবং মান (ধ্রুবক ক্ষেত্র) 0 এ সেট করুন

সামগ্রী পোকামাকড় - কখনই না নিরাপদ এরিয়াতে শীর্ষে স্ক্রোলভিউ.টপটি সারিবদ্ধ করুন


1

স্ক্রোল জন্য শীর্ষে UITableViewController, UICollectionViewControllerবা কোনো UIViewControllerথাকারUIScrollView

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


-4

আমি সব চেষ্টা করেছিলাম। তবে কিছুই আমার পক্ষে কাজ করেনি। অবশেষে আমি এটি পছন্দ করেছিলাম।

আমি self.view .addSubview(self.scroll)ভিউডিডলডে কোডের লাইন যুক্ত করেছি। স্ক্রোল ভিউ এবং ফ্রেম ভিউতে উপাদান যুক্ত করার জন্য ফ্রেম সেট আপ শুরু করার পরে।

এটা আমার জন্য কাজ করেছে।

আপনি self.view .addSubview(self.scroll)শুরুতে লাইন যুক্ত করেছেন তা নিশ্চিত করুন । তারপরে আপনি ইউআই উপাদান যুক্ত করতে পারেন।


দয়া করে এটি মুছুন। যদিও এটি অবশ্যই এ সময়টি বোধগম্য হয়েছিল, আপনার সাবউভিউ হায়ারার্কি বিষয়গুলি এই প্রশ্নের সাথে প্রাসঙ্গিক নয়।
ড্যান রোজনস্টার্ক

1
@ ক্রিসটিক যদি আপনার স্ক্রোল ভিউটি ভিউ হায়ারার্কিতে না থাকে বা আপনার কম্পিউটারটি স্যুইচ করা থাকে তবে অবশ্যই এর কোনওটিই কাজ করবে না। কিন্তু ওপি বেশ সংকীর্ণ কিছু জিজ্ঞাসা করেছে
ড্যান রোজনস্টার্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.