রিলোডলোড আইটেমএটিএন্ডেক্সপ্যাথগুলির পরে ইউআইকোলিকেশনভিউয়ের অ্যানিমেশন এড়িয়ে চলুন


91

ইউইকোলিকেশনভিউ পুনরায় লোড আইটেমএন্টেক্সপ্যাথগুলির পরে অ্যানিমেট আইটেমগুলি বলা হয় (বিবর্ণ অ্যানিমেশন)।

এই অ্যানিমেশন এড়ানোর কোনও উপায় আছে?

আইওএস 6

উত্তর:


231

এটি লক্ষণীয় যে আপনি যদি আইওএস 7 এবং তদূর্ধ্বকে লক্ষ্য করে থাকেন তবে আপনি নতুন UIViewপদ্ধতিটি ব্যবহার করতে পারেন performWithoutAnimation:। আমি সন্দেহ করি যে ফণা নীচে এটি এখানে অন্যান্য উত্তরগুলির মতো একই কাজ করছে (অস্থায়ীভাবে UIViewঅ্যানিমেশন / কোর অ্যানিমেশন ক্রিয়া অক্ষম করছে ), তবে বাক্য গঠনটি সুন্দর এবং পরিষ্কার।

বিশেষত এই প্রশ্নের জন্য ...

উদ্দেশ্য গ:

[UIView performWithoutAnimation:^{
    [self.collectionView reloadItemsAtIndexPaths:indexPaths];
}];


দ্রুত:

UIView.performWithoutAnimation {
    self.collectionView.reloadItemsAtIndexPaths(indexPaths)
}


অবশ্যই কোনও পরিবর্তন যে অ্যানিমেটেড নয় তা আপনি নিশ্চিত করতে চান এমন পরিস্থিতিতে অবশ্যই এই নীতিটি প্রয়োগ করা যেতে পারে ।


4
এটি iOS 7+ এ আমার জন্য গৃহীত উত্তরের চেয়ে আরও ভাল কাজ করেছে।
ফিলিপ সবুরিন

এটি কেবলমাত্র সংগ্রহ দেখার জন্যই নয় সমস্ত অ্যানিমেশন অক্ষম করে
ব্যবহারকারী 2159978

10
@ ব্যবহারকারী2159978 এটি সঠিক; এখানে সমস্ত উত্তর অস্থায়ীভাবে ইউআইভিউ অ্যানিমেশন অক্ষম করে। অ্যানিমেশনগুলি কেবল পাস-ইন ব্লকের মধ্যে থেকে শুরু করা ক্রিয়াকলাপের জন্য অক্ষম করা আছে, এক্ষেত্রে কেবল সংগ্রহ ভিউ'র পুনরায় লোড। এটি জিজ্ঞাসা করা প্রশ্নের একটি সম্পূর্ণ বৈধ উত্তর, সুতরাং আমি মনে করি না যে এটি একটি নিচে ভোটের যোগ্য।
স্টুয়ার্ট

অবিশ্বাস্য সমাধান। অ্যানিমেট পরিবর্তনের পরিবর্তে এটি ব্যবহারের সময়কাল: 0 কোনও আইটেম সাইজবিহীন সেল্ফ-সাইজিং কালেকশন ভিউ সেলগুলি ব্যবহার করার সময় একটি দ্রুত তবে দৃশ্যমান বিন্যাসের গতিবন্ধকে বাধা দেয়
এথন গিল 21 ই

4
এই সমাধানটি আইওএস 14 এ আর কাজ করে না, এই ব্লকের ভিতরে আমি পুনরায় ডেটা ব্যবহার করি তবে আইওএস 13 এর সাথে এটি কাজ করেছে
মার্যয় 9

161

আপনি এটি চেষ্টা করতে পারেন:

UICollectionView *collectionView;

...

[UIView setAnimationsEnabled:NO];

[collectionView performBatchUpdates:^{
    [collectionView reloadItemsAtIndexPaths:indexPaths];
} completion:^(BOOL finished) {
    [UIView setAnimationsEnabled:YES];
}];

সম্পাদনা করুন:

আমি এটিও দেখতে পেয়েছি যে আপনি performBatchUpdatesযদি কোনও ইউআইভিউ অ্যানিমেশন ব্লকে মুড়ে রাখেন তবে ডিআইএফ অ্যানিমেশনটির পরিবর্তে ইউআইভিউ অ্যানিমেশন ব্যবহার করা হবে, যাতে আপনি অ্যানিমেশনের সময়কাল 0 তে সেট করতে পারেন:

[UIView animateWithDuration:0 animations:^{
    [collectionView performBatchUpdates:^{
        [collectionView reloadItemsAtIndexPaths:indexPaths];
    } completion:nil];
}];

যদি আপনি সন্নিবেশ এবং মুছার সময় আইওএস 7 স্প্রিং অ্যানিমেশন ব্যবহার করতে চান তবে এটি অতিরিক্ত দুর্দান্ত!


4
ধন্যবাদ. ইউিকোলিকেশন ভিউ সেলগুলিতে স্টপ ওয়াচ টাইমার যুক্ত করতে এটি খুব সহায়ক ছিল।
হাটুনাইক

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

4
পিটার যেমন বলেছেন, এটি অন্যান্য অ্যানিমেশনগুলিতে হস্তক্ষেপ করে। পরিবর্তে, আপনার সমাপ্তি ব্লকের বাইরে [ইউআইভিউ সেটঅ্যানিমেশনস সক্ষম: YES] কল করা উচিত। এইভাবে আপনি কেবলমাত্র 1 টি অ্যানিমেশন প্রতিরোধ করবেন।
অ্যাডলাই হোলার

4
আমি একটি বিকল্প পদ্ধতি যুক্ত করেছি, যা ঠিক একই জিনিসটি করে।
স্যাম

4
performBatchUpdatesভিতরে raেকে animateWithDurationরাখা উজ্জ্বল! টিপ জন্য ধন্যবাদ!
রবার্ট

19

ইউইকোলিকেশনভিউ পুনরায়লোড আইটেমএন্টেক্সপ্যাথগুলির পরে অ্যানিমেট আইটেমগুলি বলা হয় (বিবর্ণ অ্যানিমেশন)।

এই অ্যানিমেশন এড়ানোর কোনও উপায় আছে?

আইওএস 6

আমি ধরে নিচ্ছি আপনি একটি ফ্ল্লোআউট ব্যবহার করছেন। যেহেতু আপনি বিবর্ণ অ্যানিমেশন থেকে মুক্তি পাওয়ার চেষ্টা করছেন তাই এটি চেষ্টা করুন:

import UIKit

class NoFadeFlowLayout: UICollectionViewFlowLayout {

    override func initialLayoutAttributesForAppearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        let attrs = super.initialLayoutAttributesForAppearingItem(at: itemIndexPath)
        attrs?.alpha = 1.0
        return attrs
    }

    override func finalLayoutAttributesForDisappearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        let attrs = super.finalLayoutAttributesForDisappearingItem(at: itemIndexPath)
        attrs?.alpha = 1.0
        return attrs
    }

}

এটি খুব পুরানো প্রশ্ন, সুতরাং আপনি সম্ভবত আর আইওএস 6 লক্ষ্য করে নিচ্ছেন না। আমি ব্যক্তিগতভাবে টিভিওএস 11 এ কাজ করছিলাম এবং একই প্রশ্ন ছিল, সুতরাং যে কেউ একই সমস্যাটি নিয়ে আসবে তাদের জন্য এটি এখানে।


4
"বাহ এটি সত্যিই ভাল কাজ করে!" এর প্রসঙ্গে এই উত্তরে 3 বা 4 টি মন্তব্য ছিল কেউ মন্তব্যগুলি সরানোর সিদ্ধান্ত নিয়েছে। আমি মনে করি, সত্যিকার অর্থে এটি এটি সম্পাদন করার আধুনিক এবং অ-হ্যাকি উপায় এবং এই মন্তব্যগুলি এটির একটি স্বীকৃতি ছিল।
ম্যাট ম্যাক

8

আমি এটি করতে ইউআইকোলিকেশনভিউতে একটি বিভাগ লিখেছি । কৌশলটি হ'ল পুনরায় লোড করার সময় সমস্ত অ্যানিমেশন অক্ষম করা:

if (!animated) {
    [CATransaction begin];
    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
}

[self reloadItemsAtIndexPaths:indexPaths];

if (!animated) {
    [CATransaction commit];
}

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

4
আপনি CATransaction.setDisableActions(true)এটির জন্য একটি শর্টহ্যান্ড হিসাবেও করতে পারেন ।
সিআইফিল্টার

5
extension UICollectionView {
    func reloadWithoutAnimation(){
        CATransaction.begin()
        CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
        self.reloadData()
        CATransaction.commit()
    }
}

এটি সুইফট 3 সিনট্যাক্স
আমজাদ তুবাসি

এটি ইউআইভিউ.পারফর্ম উইথআউট অ্যানিমেশন থেকে আরও ভাল কাজ করেছে
ল্যান্স সামেরিয়া

5

এখানে একটি performBatchUpdatesঅ্যানিমেশন ছাড়াই একটি সুইফট 3 সংস্করণ UICollectionView। আমি এটি আমার জন্য আরও ভাল কাজ করতে পেলাম collectionView.reloadData()কারণ রেকর্ডগুলি সন্নিবেশ করার সময় এটি সেল অদলবদল হ্রাস করে।

func appendCollectionView(numberOfItems count: Int){

        // calculate indexes for the items to be added
        let firstIndex = dataItems.count - count
        let lastIndex = dataItems.count - 1

        var indexPaths = [IndexPath]()
        for index in firstIndex...lastIndex {
            let indexPath = IndexPath(item: index, section: 0)
            indexPaths.append(indexPath)
        }

   UIView.performWithoutAnimation {

        self.collectionView.performBatchUpdates({ () -> Void in
            self.collectionView.insertItems(at: indexPaths)
        }, completion: { (finished) -> Void in

        })
    }
}

2
- (void)reloadCollectionViewAnimated:(BOOL)animated  {

    if (animated) {
        [self.collectionView performBatchUpdates:^{
            [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
        } completion:^(BOOL finished) {

        }];
    } else {
        [CATransaction begin];
        [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
        [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
        [CATransaction commit];
    }

}

1

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

আমার বাস্তবায়নে, পুরানো ডিভাইসে জিনিসগুলি সম্পাদন করার জন্য ক্যালেন্ডারের দৃশ্যের প্রতিনিধিত্বকারী তারিখগুলির অ্যারে তুলনামূলকভাবে ছোট রাখতে হবে যার অর্থ তৃতীয় সপ্তাহে ব্যবহারকারীকে মাঝখানে রেখে প্রায় 5 সপ্তাহের মূল্যবান তারিখ রাখা উচিত। দ্বিতীয় পদ্ধতির ব্যবহারের বিষয়টি হ'ল দ্বিতীয় ধাপে যেখানে আপনাকে অ্যানিমেশন ছাড়াই সংগ্রহের দৃশ্যটি মাঝখানে ফিরে স্ক্রোল করতে হবে, যা অবরুদ্ধ বেস অ্যানিমেশনটির কারণে কিছুটা দাগযুক্ত চেহারা তৈরি করে।

আমার কোড:

[UIView setAnimationsEnabled:NO];
[self.collectionView performBatchUpdates:^{
    [self.collectionView deleteItemsAtIndexPaths:indexPathDeleteArray];
    [self.collectionView insertItemsAtIndexPaths:indexPathAddArray];

} completion:NULL];
[UIView setAnimationsEnabled:YES];

NSIndexPath *newIndexPath = [NSIndexPath indexPathForItem:14 inSection:0];
[self.collectionView scrollToItemAtIndexPath:newIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];

0
 func reloadRowsWithoutAnimation(at indexPaths: [IndexPath]) {
        let contentOffset = collectionView.contentOffset
        UIView.setAnimationsEnabled(false)
        collectionView.performBatchUpdates {
            collectionView.reloadItems(at: indexPaths)
        }
        UIView.setAnimationsEnabled(true)
        collectionView.setContentOffset(contentOffset, animated: false)
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.