কীভাবে সনাক্ত করতে হবে যে ইউআইটিবেবল ভিউ শুরুউপডেটস / এন্ডপুটেটগুলিতে অ্যানিমেশনটি শেষ হয়ে গেছে?


116

আমি insertRowsAtIndexPaths/deleteRowsAtIndexPathsমোড়ানো ব্যবহার করে টেবিল সেলটি সন্নিবেশ / মুছে ফেলছি beginUpdates/endUpdatesbeginUpdates/endUpdatesরো-হাইট সামঞ্জস্য করার সময় আমিও ব্যবহার করছি । এই সমস্ত অপারেশনগুলি ডিফল্টরূপে অ্যানিমেটেড।

আমি কীভাবে সনাক্ত করতে পারি যে ব্যবহার করার সময় অ্যানিমেশনটি শেষ হয়ে গেছে beginUpdates/endUpdates?


1
এফওয়াইআই: এটিও প্রযোজ্য -scrollToRowAtIndexPath:atScrollPosition:animated:
বেন লাচম্যান

উত্তর:


292

এই সম্পর্কে কি?

[CATransaction begin];

[CATransaction setCompletionBlock:^{
    // animation has finished
}];

[tableView beginUpdates];
// do some work
[tableView endUpdates];

[CATransaction commit];

এটি কাজ করে কারণ টেবিলভিউ CALayerঅ্যানিমেশনগুলি অভ্যন্তরীণভাবে অ্যানিমেশনগুলি ব্যবহার করে । এটি হ'ল এনিমেশনগুলি যে কোনও খোলার সাথে যুক্ত করে CATransaction। যদি কোনও খোলা CATransactionউপস্থিত না থাকে (সাধারণ ক্ষেত্রে), তবে একটি স্পষ্টভাবে শুরু করা হয়, যা বর্তমান রানলুপের শেষে শেষ হয়। তবে আপনি যদি নিজেকে নিজেই শুরু করেন, যেমন এখানে করা হয়ে থাকে তবে তা এটি ব্যবহার করবে।


7
আমার পক্ষে কাজ করেনি। অ্যানিমেশন চলমান অবস্থায় কমপ্লিকেশন ব্লক বলা হয়।
mrvincenzo

2
@ মিআরভিন্সনজো আপনি কি স্নিপেটের completionBlockআগে সেট beginUpdatesএবং endUpdatesপছন্দ করেছেন?
রুডল্ফ আদমকোভিč

2
[CATransaction commit]আগে না পরে ডাকা উচিত [tableView endUpdates]
রুডল্ফ অ্যাডমকোভিč

6
কোনও কক্ষ অ্যানিমেশন সহ, যেমন ইউআইএসিটিভিটিআইডিসিটারভিউ সহ একটি ভিউ ধারণ করে তবে কমপ্লিট ব্লকটি কখনই ডাকা হয় না।
মার্কটর্নিপ

3
এতদিন পরেও আমি কখনই এটি জানতাম না। খাঁটি সোনা !! টেবিল ভিউ.রেলোডডেটা () এর প্রয়োজনীয় দুষ্টু দ্বারা একটি দুর্দান্ত অ্যানিমেশনটি মারা যাওয়ার পরে আর খারাপ কিছু নয় worse
ডগকফি

31

সুইফট সংস্করণ


CATransaction.begin()

CATransaction.setCompletionBlock({
    do.something()
})

tableView.beginUpdates()
tableView.endUpdates()

CATransaction.commit()

6

আপনি যদি iOS 11 এবং তদূর্ধ্বকে লক্ষ্য করে থাকেন তবে UITableView.performBatchUpdates(_:completion:)পরিবর্তে আপনার ব্যবহার করা উচিত :

tableView.performBatchUpdates({
    // delete some cells
    // insert some cells
}, completion: { finished in
    // animation complete
})

5

আপনি যে ইউআইটিএবলভিউতে কল করেছেন endUpdatesএবং এটিকে মুছে ফেলা হয়েছে তার উত্তরাধিকারী হওয়ার সম্ভাব্য সমাধান হতে পারে setContentSizeMethod, যেহেতু ইউআইটিএবল ভিউ যুক্ত করা বা সরানো সারিগুলির সাথে মেলে তার সামগ্রীর আকারকে সামঞ্জস্য করে। এই পদ্ধতির জন্য কাজ করা উচিত reloadData

কেবলমাত্র endUpdatesডাকা হওয়ার পরে কোনও বিজ্ঞপ্তি প্রেরণ করা হয়েছে তা নিশ্চিত করতে , কেউ ওভাররাইট করে endUpdatesসেখানে একটি পতাকা সেট করতে পারে ।

// somewhere in header
@private BOOL endUpdatesWasCalled_;

-------------------

// in implementation file

- (void)endUpdates {
    [super endUpdates];
    endUpdatesWasCalled_ = YES;
}

- (void)setContentSize:(CGSize)contentSize {
    [super setContentSize:contentSize];

    if (endUpdatesWasCalled_) {
        [self notifyEndUpdatesFinished];
        endUpdatesWasCalled_ = NO;
    }
}

5

আপনি ইউআইভিউ অ্যানিমেশন ব্লকে আপনার অপারেশন (গুলি) এ জাতীয়ভাবে সংযুক্ত করতে পারেন:

- (void)tableView:(UITableView *)tableView performOperation:(void(^)())operation completion:(void(^)(BOOL finished))completion
{
    [UIView animateWithDuration:0.0 animations:^{

        [tableView beginUpdates];
        if (operation)
            operation();
        [tableView endUpdates];

    } completion:^(BOOL finished) {

        if (completion)
            completion(finished);
    }];
}

Https://stackoverflow.com/a/12905114/634940 এ ক্রেডিট ।


4
এই কোডটি আমার পক্ষে কার্যকর হয়নি। সম্পূর্ণকরণ ব্লকটির পরে ডাকা হয়েছিল endUpdates, তবে অ্যানিমেশনগুলি শেষ হওয়ার আগে।
টিম ক্যামবার

1
এটি কাজ করে না। এই নমুনাটি প্রয়োগ করার সময় টেবিলভিউ অ্যানিমেশন কাজ করা বন্ধ করে দিয়েছে।
Primoz990

সময়কাল দীর্ঘায়িত করার চেষ্টা করুন (
০.০

1

এখনও একটি ভাল সমাধান খুঁজে পাওয়া যায় নি (উপক্লাসিং ইউআইটিএবলভিউয়ের সংক্ষিপ্ত)। আমি performSelector:withObject:afterDelay:আপাতত ব্যবহার করার সিদ্ধান্ত নিয়েছি । আদর্শ নয়, কাজটি পেয়ে যায়।

আপডেট : দেখে মনে হচ্ছে আমি scrollViewDidEndScrollingAnimation:এই উদ্দেশ্যে ব্যবহার করতে পারি (এটি আমার বাস্তবায়নের জন্য নির্দিষ্ট, মন্তব্য দেখুন)।


1
scrollViewDidEndScrollingAnimationশুধুমাত্র প্রতিক্রিয়াতে setContentOffsetএবংscrollRectToVisible
samvermette

@ সামভারমেট ওয়েল, আমার ক্ষেত্রে, যখন আউটপুট / শেষের আপডেটগুলি বলা হয়, ইউআইটিএবল ভিউ সর্বদা অ্যানিমেট-স্ক্রোল করে। তবে এটি আমার বাস্তবায়নের জন্য সুনির্দিষ্ট, তাই আমি সম্মত হই যে এটি সেরা উত্তর নয় তবে এটি আমার পক্ষে কার্যকর।
পিক্সেলফ্রেক

দেখে মনে হচ্ছে কোনও ইউআইভিউ অ্যানিমেশন ব্লকে আপডেটগুলি আবদ্ধ করা সম্ভব। আমার উত্তরটি নমুনা দেখুন: stackoverflow.com/a/14305039/634940
জেডনেইক

0

আপনি এর tableView:willDisplayCell:forRowAtIndexPath:মতো ব্যবহার করতে পারেন :

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"tableView willDisplay Cell");
    cell.backgroundColor = [UIColor colorWithWhite:((indexPath.row % 2) ? 0.25 : 0) alpha:0.70];
}

টেবিলের মধ্যে থাকা কোনও সেল যখন পর্দার বাইরে থেকে স্ক্রিনে চলে আসে তখন এটি আপনাকে ডাকবে যাতে আপনি যা খুঁজছেন ঠিক তা নাও হতে পারে। আমি কেবল সমস্ত ডেলিগেট পদ্ধতিগুলি দেখেছি UITableViewএবং UIScrollViewকোনও ঘর অ্যানিমেশন সন্নিবেশ করার ঠিক পরে হ্যান্ডেল করার মতো কিছু নেই বলে মনে হচ্ছে।


অ্যানিমেশনটি শেষ হয়ে গেলে কেবল যে পদ্ধতিতে আপনাকে কল করতে চান তা কেন কল করবেন না endUpdates?

- (void)setDownloadedImage:(NSMutableDictionary *)d {
    NSIndexPath *indexPath = (NSIndexPath *)[d objectForKey:@"IndexPath"];
    [indexPathDelayed addObject:indexPath];
    if (!([table isDragging] || [table isDecelerating])) {
        [table beginUpdates];
        [table insertRowsAtIndexPaths:indexPathDelayed withRowAnimation:UITableViewRowAnimationFade];
        [table endUpdates];
        // --> Call Method Here <--
        loadingView.hidden = YES;
        [indexPathDelayed removeAllObjects];
    }
}

ধন্যবাদ, ছেঁটে ভাববেনা willDisplayCellকাজ করবে। অ্যানিমেশনের পরে আমার এটি হওয়া দরকার কারণ সবকিছু স্থির হওয়ার পরে আমাকে ভিজ্যুয়াল আপডেট করতে হবে।
পিক্সেলফ্রিয়াক

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