2009-08-27 15 views
10

मैं कुछ UITableView एनिमेशन के अंत करने के लिए प्रतिक्रिया में चीजों की एक श्रृंखला करना चाहते हैं। उदाहरण के लिए, मैं स्क्रॉल ToRowAtIndexPath के माध्यम से स्क्रॉल किए जाने के बाद तालिका दृश्य कक्ष को चुनने के लिए (selectRowAtIndexPath के माध्यम से) चाहता हूं।कैसे पता चलेगा कि UITableView एनीमेशन कब पूरा हो गया है?

यह कैसे किया जा सकता है?

उत्तर

-3

खैर अगर आप एक बार scrollToRowAtIndexPath निकाल दिया गया है एक काम करवाना चाहते हैं।

- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated 

आप तो स्वयं

myAnimation.delegate = self; 

को delgate स्थापित कर सकता है कि एक बार जब आप, इन निम्नलिखित प्रतिनिधि तरीकों को सक्रिय करना चाहिए जहां डाल सकते हैं जैसे

CAAnimation *myAnimation; 

एक CAAnimation सूचक बनाने की जरूरत अपने कोड:

- (void)animationDidStart:(CAAnimation *)theAnimation 

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 
+5

कैसे आप अपने 'myAnimation' सूचक initialising कर रहे हैं? –

27

बेसिक टेम्पलेट:

[UIView animateWithDuration:0.2 animations:^{ 
    //do some animations, call them with animated:NO 
} completion:^(BOOL finished){ 
    //Do something after animations finished  
}]; 

उदाहरण:

[UIView animateWithDuration:0.2 animations:^{ 
     [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:100 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
    } completion:^(BOOL finished){ 
     //Do something after scrollToRowAtIndexPath finished, e.g.: 
     UITableViewCell *nextCell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:100 inSection:0]]; 
     [[nextCell.contentView viewWithTag:1] becomeFirstResponder];   
    }]; 
+0

इस के लिए इतने पर अब तक साफ जवाब कर रहा है "प्रदर्शन करने के लिए कैसे एक्स scrollToRowAtIndexPath पूर्ण होने के बाद?" धन्यवाद! –

+1

मुझे नहीं पता कि यह समाधान आईओएस 4/5 पर कैसे काम कर रहा था, लेकिन अब आईओएस 6.1.4 पर और मैं सामग्री के ठीक बाद देख रहा हूं स्क्रॉलटॉरोएट इंडेक्सपैथ द्वारा ऑफसेट बदल दिया गया है, इस स्थिति में सेल्स दिखाई नहीं दे रहे हैं, इसलिए दूसरा टेबलव्यू का अंश पूरी तरह खाली है, फिर कोशिकाओं को खींचा जाता है और कुंजीपटल अपेक्षित के रूप में प्रदर्शित होता है। मुझे लगता है कि UITableView का उपयोग इस तरह से नहीं किया जाना चाहिए, या कम से कम आईओएस के इस संस्करण में नहीं। ScrollToRowAtIndexPath की बजाय setContentOffset का उपयोग करके एक ही परिणाम होता है। – ggould75

+0

मुझे नहीं लगता कि यह काम कर रहा है – shim

2

मैं: 100 पंक्ति समाप्त होने पर, इस पंक्ति पर सेल हो और firstResponder के टैग के साथ सेल सामग्री दृश्य = 1 बनाने के लिए स्क्रॉल इसे एक पुरानी पोस्ट का एहसास है, लेकिन मुझे एक ही समस्या थी और एक समाधान बनाया जो मेरे लिए अच्छा काम करता था। मैंने ब्लॉक के साथ UIAlertViews बनाने के लिए NSCookBook पर उपयोग की जाने वाली तकनीकों को लागू किया। इसके कारण मैं गया क्योंकि मैं UIView के + एनिमेट के बजाय अंतर्निहित एनिमेशन का उपयोग करना चाहता था: एनिमेशन: समापन:। आईओएस 7 में परिवर्तन के साथ इन एनिमेशन के बीच एक बड़ा अंतर है।

आप UITableView के लिए एक श्रेणी बनाते हैं और कार्यान्वयन फ़ाइल में आप एक आंतरिक निजी वर्ग बनाते हैं जो ब्लॉक को कॉलबैक के प्रतिनिधि के रूप में निर्दिष्ट करके कॉलबैक करेगा। पकड़ यह है कि जब तक ब्लॉक को बुलाया जाता है, तो मूल प्रतिनिधि "बोलने" के लिए बोल जाएगा, क्योंकि नया प्रतिनिधि वह वस्तु है जो ब्लॉक को कॉल करेगा। यही कारण है कि जब मैंने ब्लॉक को मूल UITableViewDelegate को पुन: असाइन करने के लिए बुलाया था तो संदेश भेजने के लिए एक अधिसूचना दी गई। इस कोड का परीक्षण किया गया है और मेरे अंत में काम कर रहा है।

// Header file 
@interface UITableView (ScrollDelegateBlock) 

-(void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath 
      atScrollPosition:(UITableViewScrollPosition)scrollPosition 
        animated:(BOOL)animated 
       scrollFinished:(void (^)())scrollFinished; 

@end 


// Implementation file 
#import "UITableView+ScrollDelegateBlock.h" 
#import <objc/runtime.h> 

NSString *const BLOCK_CALLED_NOTIFICATION = @"BlockCalled"; 

@interface ScrollDelegateWrapper : NSObject <UITableViewDelegate> 

@property (copy) void(^scrollFinishedBlock)(); 

@end 

@implementation ScrollDelegateWrapper 

-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { 
    if (self.scrollFinishedBlock) { 
     [[NSNotificationCenter defaultCenter] postNotificationName:BLOCK_CALLED_NOTIFICATION object:nil]; 
     self.scrollFinishedBlock(); 
    } 
} 

@end 

static const char kScrollDelegateWrapper; 

static id<UITableViewDelegate>previousDelegate; 

@implementation UITableView (ScrollDelegateBlock) 

-(void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath 
      atScrollPosition:(UITableViewScrollPosition)scrollPosition 
        animated:(BOOL)animated 
       scrollFinished:(void (^)())scrollFinished { 
    previousDelegate = self.delegate; 
    ScrollDelegateWrapper *scrollDelegateWrapper = [[ScrollDelegateWrapper alloc] init]; 
    scrollDelegateWrapper.scrollFinishedBlock = scrollFinished; 
    self.delegate = scrollDelegateWrapper; 

    objc_setAssociatedObject(self, &kScrollDelegateWrapper, scrollDelegateWrapper, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 

    [self scrollToRowAtIndexPath:indexPath atScrollPosition:scrollPosition animated:animated]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(blockCalled:) 
               name:BLOCK_CALLED_NOTIFICATION 
               object:nil]; 
} 

/* 
* Assigns delegate back to the original delegate 
*/ 
-(void) blockCalled:(NSNotification *)notification { 
    self.delegate = previousDelegate; 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:BLOCK_CALLED_NOTIFICATION 
                object:nil]; 
} 

@end 

फिर आप एक ब्लॉक के साथ किसी भी अन्य की तरह विधि कॉल कर सकते हैं:

[self.tableView scrollToRowAtIndexPath:self.currentPath 
          atScrollPosition:UITableViewScrollPositionMiddle 
            animated:YES 
          scrollFinished:^{ 
           NSLog(@"scrollFinished"); 
          } 
]; 
+0

इसे पोस्ट करने के लिए धन्यवाद।इसे मेरे संग्रह दृश्य में कनवर्ट किया गया और सही काम करता है। – Augie

+2

त्वरित नोट: यदि स्क्रॉलव्यू पहले से ही शीर्ष पर है, तो समापन ब्लॉक ट्रिगर नहीं होता है। पहले स्थिति की जांच करने की जरूरत है। – Augie

+0

यह काम करता है, हालांकि यह स्क्रॉल के दौरान/उसके बाद फोर्सेल की ऊंचाई को अनदेखा करता है। मेरे पास प्रत्येक सेक्शन के नीचे एक छोटा सा सेल है, हालांकि यह विधि छोटी कोशिकाओं को अन्य सभी के समान आकार बनाती है। – Darren

संबंधित मुद्दे

 संबंधित मुद्दे