ইউইকোলিকেশনভিউ পুনরায় লোড আইটেমএন্টেক্সপ্যাথগুলির পরে অ্যানিমেট আইটেমগুলি বলা হয় (বিবর্ণ অ্যানিমেশন)।
এই অ্যানিমেশন এড়ানোর কোনও উপায় আছে?
আইওএস 6
উত্তর:
এটি লক্ষণীয় যে আপনি যদি আইওএস 7 এবং তদূর্ধ্বকে লক্ষ্য করে থাকেন তবে আপনি নতুন UIView
পদ্ধতিটি ব্যবহার করতে পারেন performWithoutAnimation:
। আমি সন্দেহ করি যে ফণা নীচে এটি এখানে অন্যান্য উত্তরগুলির মতো একই কাজ করছে (অস্থায়ীভাবে UIView
অ্যানিমেশন / কোর অ্যানিমেশন ক্রিয়া অক্ষম করছে ), তবে বাক্য গঠনটি সুন্দর এবং পরিষ্কার।
বিশেষত এই প্রশ্নের জন্য ...
উদ্দেশ্য গ:
[UIView performWithoutAnimation:^{
[self.collectionView reloadItemsAtIndexPaths:indexPaths];
}];
দ্রুত:
UIView.performWithoutAnimation {
self.collectionView.reloadItemsAtIndexPaths(indexPaths)
}
অবশ্যই কোনও পরিবর্তন যে অ্যানিমেটেড নয় তা আপনি নিশ্চিত করতে চান এমন পরিস্থিতিতে অবশ্যই এই নীতিটি প্রয়োগ করা যেতে পারে ।
আপনি এটি চেষ্টা করতে পারেন:
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 স্প্রিং অ্যানিমেশন ব্যবহার করতে চান তবে এটি অতিরিক্ত দুর্দান্ত!
performBatchUpdates
ভিতরে raেকে animateWithDuration
রাখা উজ্জ্বল! টিপ জন্য ধন্যবাদ!
ইউইকোলিকেশনভিউ পুনরায়লোড আইটেমএন্টেক্সপ্যাথগুলির পরে অ্যানিমেট আইটেমগুলি বলা হয় (বিবর্ণ অ্যানিমেশন)।
এই অ্যানিমেশন এড়ানোর কোনও উপায় আছে?
আইওএস 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 এ কাজ করছিলাম এবং একই প্রশ্ন ছিল, সুতরাং যে কেউ একই সমস্যাটি নিয়ে আসবে তাদের জন্য এটি এখানে।
আমি এটি করতে ইউআইকোলিকেশনভিউতে একটি বিভাগ লিখেছি । কৌশলটি হ'ল পুনরায় লোড করার সময় সমস্ত অ্যানিমেশন অক্ষম করা:
if (!animated) {
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
}
[self reloadItemsAtIndexPaths:indexPaths];
if (!animated) {
[CATransaction commit];
}
CATransaction.setDisableActions(true)
এটির জন্য একটি শর্টহ্যান্ড হিসাবেও করতে পারেন ।
extension UICollectionView {
func reloadWithoutAnimation(){
CATransaction.begin()
CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
self.reloadData()
CATransaction.commit()
}
}
এখানে একটি 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
})
}
}
- (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];
}
}
কেবল আমার $ 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];
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)
}