UITableView সারি অ্যানিমেশন সময়কাল এবং সমাপ্তি কলব্যাক


100

ইউআইটিএবলভি সারি অ্যানিমেশনগুলির জন্য সময়কাল নির্দিষ্ট করার কোনও উপায় আছে বা অ্যানিমেশনটি সম্পূর্ণ হওয়ার পরে কলব্যাক পাওয়ার কোনও উপায় আছে কি?

আমি যা করতে চাই তা হ'ল অ্যানিমেশন শেষ হওয়ার পরে স্ক্রোল সূচকগুলি ফ্ল্যাশ করা। এর আগে ফ্ল্যাশ করা কিছু করে না। এখনও অবধি আমার যে পরিমাণ কার্যকারণ রয়েছে তা হ'ল অর্ধেক সেকেন্ড বিলম্বিত করা (এটি ডিফল্ট অ্যানিমেশনের সময়কাল বলে মনে হচ্ছে), যেমন:

[self.tableView insertRowsAtIndexPaths:newRows
                      withRowAnimation:UITableViewRowAnimationFade];
[self.tableView performSelector:@selector(flashScrollIndicators)
                     withObject:nil
                     afterDelay:0.5];

আমি নিজে চেষ্টা করি নি, তবে কিছু সূচকের পথটি পরিচালনা করে এটি এটি করতে পারে:- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath
কালে

উত্তর:


3

আজকাল আপনি যদি এটি করতে চান তবে আইওএস 11 থেকে নতুন ফাংশন শুরু হচ্ছে :

- (void)performBatchUpdates:(void (^)(void))updates 
                 completion:(void (^)(BOOL finished))completion;

আপডেট ক্লোজারগুলিতে আপনি স্টার্টআপডেটস () / এন্ডপুটেটস বিভাগে একই কোড রাখেন। এবং সমাপ্তি সমস্ত অ্যানিমেশন পরে সম্পাদন করা হয়।


এটা অসাধারণ. আমি এই সংযোজন লক্ষ্য করিনি।
ড্যানিয়েল ডিকিসন

207

সবেমাত্র এদিকে এসেছিল। এটি কীভাবে করবেন তা এখানে:

উদ্দেশ্য গ

[CATransaction begin];
[tableView beginUpdates];
[CATransaction setCompletionBlock: ^{
    // Code to be executed upon completion
}];
[tableView insertRowsAtIndexPaths: indexPaths
                 withRowAnimation: UITableViewRowAnimationAutomatic];
[tableView endUpdates];
[CATransaction commit];

সুইফট

CATransaction.begin()
tableView.beginUpdates()
CATransaction.setCompletionBlock {
    // Code to be executed upon completion
}
tableView.insertRowsAtIndexPaths(indexArray, withRowAnimation: .Top)
tableView.endUpdates()
CATransaction.commit()

4
আবার, এখানে নির্দোষভাবে কাজ করে works iOS6 এবং সমস্ত। এটি ডিফল্ট অ্যানিমেশনে বৈশিষ্ট্যগুলিকে ওভাররাইড করার জন্য একটি উপযুক্ত SDK- সমর্থিত প্রক্রিয়া। আপনার CATransaction ভিতরে সম্ভবত আপনার অতিরিক্ত, দীর্ঘ-চলমান অ্যানিমেশন রয়েছে? তারা বাসা বেঁধেছে, আপনি জানেন।
কারওয়াগ

4
IOS6 এ আমার জন্য দুর্দান্ত কাজ করে। তার জন্য ধন্যবাদ!
অ্যারন

5
setAnimationDurationসন্নিবেশ / মোছার সময়কাল প্রভাবিত করে না বলে মনে হচ্ছে। আইওএস 6
টম রেডম্যান

4
কীভাবে সময়কাল পরিবর্তন করবেন তার জন্য কোনও পরামর্শ? অক্ষর সেটঅ্যানিমেশনডিউশন: কোনও পার্থক্য বলে মনে হচ্ছে না।
জেফ গ্রিমস

5
আইওএস 5.1.1, 6.1, 7.0 এও আমার পক্ষে কাজ করে; তবে, অ্যানিমেশনের পরে যদি আপনাকে নতুন টেবিলভিউ.কন্টেন্টসাইজটি পাওয়া দরকার (তবে এটি আমার ক্ষেত্রে যেমন ছিল) তবে আপনার অবশ্যই ব্যবহার করতে হবে [সেল্ফ পারফর্মসিলেটরঅনমেনথ্রেড: উইল অবজেক্ট: ওয়েটইন্টিলডোন:]; পরের রানলুপে আপনার প্রতিনিধিকে কল করার জন্য সেট কমপ্লিশন ব্লকে। আপনি যদি আপনার প্রতিনিধিটিকে সরাসরি পারফরমইসলেটরঅনমেনথ্রেড ব্যতীত কল করেন তবে আপনি টেবিল ভিউ কনটেন্টসাইজের জন্য পুরানো মান পাবেন।
স্ল্যামার

38

কারওয়াগের সূক্ষ্ম উত্তরের উপর বিস্তৃত হয়ে , নোট করুন আইওএস 7-এ, ইউআইভিউ এনিমেশন সহ ক্যাটারান্সেকশনকে ঘিরে টেবিল অ্যানিমেশন সময়কালের নিয়ন্ত্রণ সরবরাহ করে।

[UIView beginAnimations:@"myAnimationId" context:nil];

[UIView setAnimationDuration:10.0]; // Set duration here

[CATransaction begin];
[CATransaction setCompletionBlock:^{
    NSLog(@"Complete!");
}];

[myTable beginUpdates];
// my table changes
[myTable endUpdates];

[CATransaction commit];
[UIView commitAnimations];

ইউআইভিউ অ্যানিমেশনটির সময়কাল আইওএস on-এ কোনও প্রভাব ফেলেনি Perhaps সম্ভবত আইওভি 7 সারণী অ্যানিমেশনগুলি ইউআইভিউ স্তরে ভিন্নভাবে প্রয়োগ করা হবে।


অ্যানিমেশন সময়কাল উপেক্ষা করা হবে বলে মনে হচ্ছে।
ডাস্টিন

26

এটি একটি কার্যকর কৌশল একটি জাহান্নাম! আমি সর্বদা CATransaction স্টাফ না লিখতে একটি ইউআইটিএবলভিউ এক্সটেনশন লিখেছিলাম।

import UIKit

extension UITableView {

    /// Perform a series of method calls that insert, delete, or select rows and sections of the table view.
    /// This is equivalent to a beginUpdates() / endUpdates() sequence, 
    /// with a completion closure when the animation is finished.
    /// Parameter update: the update operation to perform on the tableView.
    /// Parameter completion: the completion closure to be executed when the animation is completed.

    func performUpdate(_ update: ()->Void, completion: (()->Void)?) {

        CATransaction.begin()
        CATransaction.setCompletionBlock(completion)

        // Table View update on row / section
        beginUpdates()
        update()
        endUpdates()

        CATransaction.commit()
    }

}

এটি এর মতো ব্যবহৃত হয়:

// Insert in the tableView the section we just added in sections
self.tableView.performUpdate({
            self.tableView.insertSections([newSectionIndex], with: UITableViewRowAnimation.top)

        }, completion: {
            // Scroll to next section
            let nextSectionIndexPath = IndexPath(row: 0, section: newSectionIndex)
            self.tableView.scrollToRow(at: nextSectionIndexPath, at: .top, animated: true)
        })

দুর্দান্ত উত্তর! আমি সুইফটকে ভালবাসি এই কারণগুলির মধ্যে একটি
জিয়ান্নি কার্লো

@ জিয়ান্নি কার্লো আপনি ওবিজেসি তেও এটি করতে পারেন
সাইবারময়েউ

@ সাইবারমাইও হ্যাঁ, তবে একটি বিভাগ তৈরি করা সবসময় এ জাতীয় ব্যথা হয়ে থাকে, বিশেষত অতিরিক্ত ফাইলগুলির দীর্ঘ নামগুলির কারণে
জিয়ান্নি কার্লো

এটি কেবল আইওএস 11 এ উপলব্ধ, এটি আইওএস 10 এ কীভাবে ব্যবহার করবেন?
কেমডো

@ কেমডো আপনি কেন বলেন যে এটি কেবল আইওএস 11 এ উপলব্ধ? setCompletionBlockআইওএস 4+ বাদে এখানে সবকিছুই আইওএস 2+
ফ্রিডেরিক অ্যাডা

25

সংক্ষেপিত ব্রেন্ট এর জরিমানা উত্তর , অন্তত আইওএস 7 আপনি যদি একটি সমস্ত tersely এই মোড়ানো করতে [UIView animateWithDuration: বিলম্ব: বিকল্প: অ্যানিমেশন: সমাপ্তির:] কল:

[UIView animateWithDuration:10 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
  [self.tableView beginUpdates];
  [self.tableView endUpdates];
} completion:^(BOOL finished) {
  // completion code
}];

যদিও, আমি ইজেআইনআউট বাদে অন্য কোনও কিছু থেকে ডিফল্ট অ্যানিমেশন বক্ররেখাকে ওভাররাইড করে দেখছি না।


4
এইভাবে কোনও সারি সন্নিবেশ করানোর সময় বা @ ব্রেন্টের উপায়ে, সময়কালটি সম্মানিত হওয়া সত্ত্বেও, ইউআইটিএবলভিউআরএনিমেশনটি সম্মানজনক বলে মনে হয় না এবং সর্বদা উপরে নীচে সঞ্চারিত হয়, এমনকি আমি উল্লেখ করি, উদাহরণস্বরূপ UITableViewRowAnimationLeft। আইওএস 8.4-এ পরীক্ষা করা কি কারও সমাধান আছে?
ড্যানি


7

আমার জন্য এটি সংগ্রহের ভিউয়ের জন্য আমার দরকার ছিল। এটি সমাধানের জন্য আমি একটি সাধারণ এক্সটেনশন করেছি:

extension UICollectionView {

    func reloadSections(sections: NSIndexSet, completion: () -> Void){
        CATransaction.begin()
        CATransaction.setCompletionBlock(completion)

        self.reloadSections(sections)

        CATransaction.commit()
    }

}

1

যেমন টেবিলভিউয়ের performBatchপদ্ধতিটি কেবলমাত্র আইওএস 11 থেকে শুরু হয়ে যায় , আপনি নিম্নলিখিত এক্সটেনশনটি ব্যবহার করতে পারেন:

extension UITableView {
func performUpdates(_ updates: @escaping () -> Void, completion: @escaping (Bool) -> Void) {
        if #available(iOS 11.0, *) {
            self.performBatchUpdates({
                updates()
            }, completion: completion)
        } else {
            CATransaction.begin()
            beginUpdates()
            CATransaction.setCompletionBlock {
                completion(true)
            }
            updates()
            endUpdates()
            CATransaction.commit()
        }
    }
}

0

এন্টোইনের উত্তরটি বেশ ভাল - তবে এটি ইউআইকোলিকেশনভিউয়ের জন্য। এটি এটি ইউআইটিএবলভিউয়ের জন্য:

extension UITableView {
    func reloadSections(_ sections: IndexSet, with rowAnimation: RowAnimation, completion: (() -> Void)?) {
        CATransaction.begin()
        CATransaction.setCompletionBlock(completion)
        
        self.reloadSections(sections, with: rowAnimation)
        
        CATransaction.commit()
    }
}

যেমন বলা হয়:

tableView.reloadSections(IndexSet(0), with: .none, completion: {
    // Do the end of animation thing        
})

-8

আপনি insertRowsAtIndexPath a এ মোড়ানোর চেষ্টা করতে পারেন

- (void)beginUpdates
- (void)endUpdates

লেনদেন, তারপরে ফ্ল্যাশটি করুন।


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