2013-02-15 18 views
12

मैं एक टेबलव्यू ऑफसेट को एनिमेट करने की कोशिश कर रहा हूं, फिर पूरा होने पर ब्लॉक इसे वापस ले जाएगा। लेकिन मेरा कोड पूरा होने में कुछ भी नहीं कर रहा है ब्लॉक:UIView एनिमेट और समापन ब्लॉक

-(void)viewDidAppear:(BOOL)animated { 
    if (TRUE) { 
     NSLog(@"animating table view"); 

     [UIView animateWithDuration:.25 
         animations:^{ 
          self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y - 60); 
         } 
         completion:^(BOOL finished){ 
          NSLog(@"completion block"); 
         }]; 
    } 
} 

"समापन ब्लॉक" कभी भी आउटपुट नहीं हो जाता ... कोई विचार?

संपादित करें:

ठीक है, तो यह मेरी UIREfreshControl के साथ कुछ है:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    if (TRUE) { 
     UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; 
     refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"]; 
     [refresh addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged]; 

     [self setRefreshControl:refresh]; 
    } 
} 

जब ताज़ा नियंत्रण जोड़ा जाता है, यह पूरा होने के ब्लॉक से सक्रिय नहीं होगा। अगर मैं नियंत्रण नहीं जोड़ता, तो यह इरादे के रूप में काम करता है।

संपादित करें 2:

कश्मीर, इसलिए यदि मैं तालिका दृश्य स्क्रॉल करें, पूरा होने के ब्लॉक तो निकाल दिया जाता है:

2013-02-15 13:37:06.266 [1922:14003] animating table view 
2013-02-15 13:37:14.782 [1922:14003] completion block 

कोड के रूप में सही होने के बाद "animating तालिका लिखा" पूरा होने के ब्लॉक "लॉग इन करना चाहिए देखें ", लेकिन इसमें 8 सेकंड देरी का कारण है जब मैंने टेबल को स्क्रॉल किया था।

कैसे "ताज़ा करने के लिए खींचें" लगता है:

enter image description here

+1

सिर्फ परीक्षण परियोजना पर अपने कोड tryed, और ' समापन ब्लॉक 'को कंसोल पर आउटपुट किया गया है। आपने इसे सिम्युलेटर या डिवाइस पर आज़माया है। आप किस आईओएस संस्करण का इस्तेमाल करते हैं, एक्सकोड संस्करण? – jamapag

+0

सिम्युलेटर, आईओएस 6.1, एक्सकोड 4.6। आपने इसे' viewDidAppear: 'विधि में किया है? – Padin215

+1

हम्म, मैं एक ही सेटअप है। क्या 'viewDidAppear' कहा जाता है? – jamapag

उत्तर

8

मैं इस मुद्दे को पुन: पेश करने में सक्षम था और एक कामकाज पाया।

UIScrollView का उपयोग करते समय, UITableView विरासत से प्राप्त होता है, तो आप इसे contentOffset नहीं बदल सकते हैं एक एनिमेटेबल संपत्ति नहीं है। इसके बजाय, आपको विधि setContentOffset:animated: का उपयोग करने की आवश्यकता है।

तो, इस प्रकार है कि आप क्या करने की आवश्यकता है:

  1. UITableView प्रतिनिधि के रूप में आपके विचार नियंत्रक सेट करें। मैंने viewDidAppear पर किया था।
  2. ध्वज सेट करें, इसलिए आप प्रतिनिधि में जानते हैं कि स्क्रॉल हुआ क्योंकि आपने ट्रिगर किया था।
  3. प्रतिनिधि विधि - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView में, एनीमेशन वापस बाउंस (आप यहाँ performSelector:afterDelay: का उपयोग करके एक देरी जोड़ सकता है

कोड यह रहा:।

@interface MyViewController() 

@property (assign, nonatomic) BOOL shouldReturn; 

@end 

@implementation MyViewController 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    if (TRUE) { 
     NSLog(@"animating table view"); 
     self.shouldReturn = YES; 
     self.tableView.delegate = self; 
     [self.tableView setContentOffset: 
        CGPointMake(self.tableView.contentOffset.x, 
           self.tableView.contentOffset.y - 60) 
           animated:YES]; 
    } 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    if (TRUE) { 
     UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; 
     refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"]; 
     [refresh addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged]; 

     [self setRefreshControl:refresh]; 
    } 
} 

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { 
    if (self.shouldReturn) { 
     self.shouldReturn = NO; 
     [self.tableView setContentOffset:CGPointZero animated:YES]; 
    } 
} 

@end 
+0

ठीक है, यह काम करता है! मुझे यकीन नहीं है कि आपने 'self.tableView.delegate = self' क्यों सेट किया है। मैंने इसे जोड़ा नहीं है और यह काम करता है। मैंने एक '[स्वयं प्रदर्शन चयनकर्ता: @ चयनकर्ता (परीक्षण) में जोड़ा है ऑब्जेक्ट: शून्य बाद के बाद: 2]' और सही काम करता है, धन्यवाद! – Padin215

+0

+1, @pgb, अच्छी पकड़ .. – iDev

+0

मैंने प्रतिनिधि को सेट किया क्योंकि मैंने आईबी पर इसे तार नहीं दिया है। मुझे लगता है कि आप इसे पूरा नहीं कर पाए क्योंकि आपका व्यू कंट्रोलर पहले ही टेबल प्रतिनिधि था। – pgb

13

मैं इस और काम ठीक किया करते थे। इसका वैकल्पिक समाधान

[UIView animateWithDuration:0.5 
           delay:0.1 
          options: UIViewAnimationOptionCurveEaseOut 
         animations:^ 
     { 
      CGRect frame = self.adBannerView.frame; 

      self.adBannerView.frame = frame; 
     } 
         completion:^(BOOL finished) 
     { 
     }]; 

देरी और विकल्प जोड़ने का प्रयास करें।

+0

इससे कोई फर्क क्यों पड़ता है? एक 'एनिमेट विथ अवधि: एनिमेशन: समापन:' विधि के साथ-साथ –

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