ইনডেক্সপথে ইউআইকোলিকেশনভিউ অটো স্ক্রোল করুন


101

সংগ্রহটি লোড করার আগে ব্যবহারকারী ভিউ অ্যারেতে চিত্রের সংখ্যা সেট করে। সমস্ত কক্ষ স্ক্রিনে ফিট করে না। আমার 30 টি সেল রয়েছে এবং স্ক্রিনে কেবল 6 টি রয়েছে।

প্রশ্ন: ইউআইকোলিকেশনভিউয়ের লোডে স্বয়ংক্রিয়ভাবে পছন্দসই চিত্র সহ কক্ষে কীভাবে স্ক্রোল করবেন?

উত্তর:


90

আমি খুঁজে পেয়েছি যে স্ক্রোলিংটি viewWillAppearনির্ভরযোগ্যভাবে কাজ করতে পারে না কারণ সংগ্রহ ভিউটি এখনও এটির বিন্যাস শেষ করে নি; আপনি ভুল আইটেম স্ক্রোল করতে পারেন।

আমি আরও জানতে পেরেছি যে viewDidAppearএগুলিতে স্ক্রোলিংয়ের ফলে অবিচ্ছিন্ন দর্শনটির একটি মুহূর্তের ফ্ল্যাশ দৃশ্যমান হবে।

এবং, আপনি যদি প্রতিবার এই মাধ্যমে স্ক্রোল করেন viewDidLayoutSubviewsতবে ব্যবহারকারী ম্যানুয়ালি স্ক্রোল করতে সক্ষম হবে না কারণ প্রতিচ্ছবি স্ক্রোল করার সময় কিছু সংগ্রহ লেআউট সাবউভিউ লেআউট তৈরি করে।

আমি যা খুঁজে পেয়েছি তা নির্ভরযোগ্যভাবে কাজ করে:

উদ্দেশ্য গ :

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    // If we haven't done the initial scroll, do it once.
    if (!self.initialScrollDone) {
        self.initialScrollDone = YES;

        [self.collectionView scrollToItemAtIndexPath:self.myInitialIndexPath
                                    atScrollPosition:UICollectionViewScrollPositionRight animated:NO];
    }
}

দ্রুত:

 override func viewWillLayoutSubviews() {

    super.viewWillLayoutSubviews()

      if (!self.initialScrollDone) {

         self.initialScrollDone = true
         self.testNameCollectionView.scrollToItem(at:selectedIndexPath, at: .centeredHorizontally, animated: true)
    }

}

সুন্দর টিপ। initialScrollDoneএই পদ্ধতিটি একাধিকবার কল করা হবে এবং আপনি যদি স্ক্রোলটিআইটেমটিটেক্সপথ কল করেন যেহেতু লেনক যেমনটি করেছে তখন আমি একটি পতাকা ব্যবহারের উপর জোর দিয়ে বলব: একাধিকবার সংগ্রহটি রেকর্ড করা হয়েছে বলে মনে হচ্ছে না করা (আইওএস সিমুলেটর আইফোন 5 / আইওএস 8)
মেজ

1
IOS8 এ দুর্দান্ত কাজ করে। গ্রহণযোগ্য উত্তর হওয়া উচিত।
নিক

5
এটি iOS 8.3 এ আমার জন্য কাজ করে নি। [self.collectionView layoutIfNeeded];আগে কল করতে হয়েছিল, এটি যখন আপনি এটির মধ্যে এটি করেন তখনও কাজ করে viewDidLoad
ব্রেন্ট ডিলিংহাম

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

এটি আইওএস 9 এও কাজ করে এবং আমার অটো লেআউটটিকেও গোলমাল করে না।
মিস্টার জাস্টিম

168

নতুন, সম্পাদিত উত্তর:

এটি যোগ করুন viewDidLayoutSubviews

স্যুইফ্ট

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let indexPath = IndexPath(item: 12, section: 0)
    self.collectionView.scrollToItem(at: indexPath, at: [.centeredVertically, .centeredHorizontally], animated: true)
}

সাধারণত, .centerVerticallyকেস হয়

ObjC

-(void)viewDidLayoutSubviews {
   [super viewDidLayoutSubviews];
    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:12 inSection:0];
   [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically | UICollectionViewScrollPositionCenteredHorizontally animated:NO];
}

পুরানো আইওএসের জন্য পুরানো উত্তর কাজ করছে

এটি এতে যুক্ত করুন viewWillAppear:

[self.view layoutIfNeeded];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO];

4
ঠিক এটিই আমি ব্যবহার করার চেষ্টা করছি। অ্যারেতে আমার বস্তুর সংখ্যা আছে এবং আমি সেই অবজেক্টের নাম জানি। তবে সঠিক ইন্ডেক্সপথ কীভাবে রাখবেন তা জানেন না ... কোনও ধারণা?
আলেকজান্ডারজ

4
আপনি সহজেই তৈরি করতে পারেন indexPath:[NSIndexPath indexPathForItem:numberOfTheObject inSection:sectionNumber]
বোনেইডম্যান

3
কিছু ত্রুটি ছিল। তবে তারপরে আমি সমস্ত উল্লিখিত কোডটি (অকার্যকর) ভিউডিডলআউটসউবভিউস inside inside এর ভিতরে রেখেছি এবং এখন এটি ঠিকঠাক কাজ করছে। থানেক্স বোগদান
আলেকজান্ডারজ

1
আমি কীভাবে ঘরের মধ্যে 'জুম' করতে পারি, এবং এটি বাড়িয়ে তুলতে পারি?
ফতুহোকু

9
এটি আইওএস 7.1 এ নির্ভরযোগ্যভাবে কাজ করে না এবং এটি কালেকশন ভিউটি কালো স্ক্রিন হিসাবে উপস্থিত হতে পারে। আমি নীচের ভিউডিডলআউটসুভিউগুলিতে সমাধানের মতো রাজ্যও বজায় রাখতে চাইনি। আমি যা করলাম তা কেবলমাত্র [সেলফ ভিউ লেআউটআইফিডে]] স্ক্রোলটিআইটেমএটেক্সেক্সপথের কল করার আগেই করা হয়েছিল
ড্যানিয়েল গালাসকো

15

আমি উপরের উত্তরের সাথে সম্পূর্ণ একমত একমাত্র বিষয় হ'ল আমার জন্য সমাধানটি ভিউডিড অ্যাপায়ারে কোড সেট করে

viewDidAppear 
{
    [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES];
}

আমি যখন ভিউউইল অ্যাপ্লিকেশনটি ব্যবহার করি তখন স্ক্রোলিংটি কাজ করে না।


2
ভিউডিডঅ্যাপারে যে অসুবিধা রয়েছে যা আপনি সংগ্রহের দৃশ্যটি চলন্ত / ঝলকানি দেখছেন, ভিউ ইতিমধ্যে উপস্থিত হয়েছে (নামটি থেকেই বোঝা যাচ্ছে) ... আমি সত্যিই অবাক হয়েছি কেন অ্যাপল এটিকে এত সুন্দর অস্বাভাবিক ক্ষেত্রে ডিজাইন করেন নি, ভিউডিডডায়াউটসউভিউস উপায়টি হ'ল কিছুটা বিশ্রী
TheEye

12

এটি আমার পক্ষে কাজ করেছে বলে মনে হয়েছিল এটি অন্য জবাবের মতো তবে এতে কিছু স্বতন্ত্র পার্থক্য রয়েছে:

- (void)viewDidLayoutSubviews
{     
   [self.collectionView layoutIfNeeded];
   NSArray *visibleItems = [self.collectionView indexPathsForVisibleItems];
   NSIndexPath *currentItem = [visibleItems objectAtIndex:0];
   NSIndexPath *nextItem = [NSIndexPath indexPathForItem:someInt inSection:currentItem.section];

   [self.collectionView scrollToItemAtIndexPath:nextItem atScrollPosition:UICollectionViewScrollPositionNone animated:YES];
}

12

সুইফট:

your_CollectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: true)

সুইফট 3

let indexPath = IndexPath(row: itemIndex, section: sectionIndex)

collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.right, animated: true)

স্ক্রোল অবস্থান:

UICollectionViewScrollPosition.CenteredHorizontally / UICollectionViewScrollPosition.CenteredVertically

9

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

- (void)viewDidLoad {
    dispatch_async (dispatch_get_main_queue (), ^{
        NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH;
        [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
    });
}

পজিশন 3 হলে ইনডেক্সপথ কীভাবে পাবেন?
কেমডো

5

আমি এটিতে এটি করার পরামর্শ দিচ্ছি collectionView: willDisplay:তারপরে আপনি নিশ্চিত হতে পারেন যে সংগ্রহ ভিউ প্রতিনিধি কিছু সরবরাহ করে। এখানে আমার উদাহরণ:

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    /// this is done to set the index on start to 1 to have at index 0 the last image to have a infinity loop
    if !didScrollToSecondIndex {
        self.scrollToItem(at: IndexPath(row: 1, section: 0), at: .left, animated: false)
        didScrollToSecondIndex = true
    }
}

1
আমি খুঁজে পেয়েছি যে উইলডিসপ্লে পরিবর্তে didEndDisplaying ব্যবহার করে এটি সঠিকভাবে কাজ করার উপায় ছিল। উইলডিসপ্লে যতক্ষণ না সেল স্ক্রিনে ছিল ঠিক ছিল; তবে, সেলটি এখনও স্ক্রিনে না থাকলে এই পদ্ধতিটি আমাকে এতে স্ক্রোল করে না। didEndDisplaying যদিও ব্যবহারের ক্ষেত্রে পুরোপুরি কাজ করে। আপনার উত্তর আমাকে সঠিক পথে স্থাপনের প্রশংসা করুন!
C6Silver

2

উপরে উল্লিখিত বিকল্প হিসাবে। ডেটা লোডের পরে কল করুন:

দ্রুতগতি

collectionView.reloadData()
collectionView.layoutIfNeeded()
collectionView.selectItem(at: indexPath, animated: true, scrollPosition: .right)

1

এখানে সমস্ত উত্তর - হ্যাকস। পুনঃডোডের পরে কোথাও সংগ্রহের ভিউ স্ক্রোল করার আরও ভাল উপায় আমি খুঁজে পেয়েছি:
সাবক্লাস সংগ্রহ ভিউ লেআউটটি আপনি কখনই ব্যবহার করেন লেআউট, ওভাররাইড পদ্ধতিটি রেডিআউট, সুপার কলের পরে আপনার যা অফসেট সেট হবে তা সেট করে।
উদাঃ https://stackoverflow.com/a/34192787/1400119

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