2012-02-27 20 views
5

मैं उस पुल-डाउन-टू-रीफ्रेश चीज़ को कर रहा हूं। ScrollViewDidEndDecelerating में मैं जांचता हूं कि ऑफ़सेट एक निश्चित बिंदु से पहले है और scrollViewDidEndDragging में मैंने सामग्री सेट की है ताकि खींचने वाले अनुभाग को दृश्यमान रखा जा सके।UITableView झिलमिलाहट के कारण ताज़ा करने के लिए खींचें। इसे कैसे रोकें?

हालांकि, यह परिणामस्वरूप झटके में पड़ता है, शायद सामग्री के कारण स्क्रॉलिंग एनीमेशन के दौरान रीसेट किया जा रहा है। मैंने सोचा कि मैं scrollViewWillEndDragging में targetContentOffset सेट करके इसे रोकने में सक्षम हो सकता हूं, लेकिन ऐसा लगता है कि यह चाल नहीं है।

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 

    if (scrollView.contentOffset.y < -kRefreshViewDelta) 
    { 
     self.tableView.contentInset = UIEdgeInsetsMake(kRefreshViewHeight, 0.0f, 0.0f, 0.0f); 

    } 
} 

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    if (scrollView.contentOffset.y < -kRefreshViewDelta) 
    { 
      targetContentOffset->y = kRefreshViewHeight ; 
    } 
} 

उत्तर

10

आप (स्क्रॉल या अन्यथा के दौरान) फ्रेम बिल्कुल UITableView करने के लिए सौंपा बदलते हैं तो इसके contentInset डिफ़ॉल्ट (0,0,0,0) करने के लिए सेट कर देगा। कुछ राज्य खान के लिए जाँच कर रहा है, लेकिन अनिवार्य रूप से यह मैं मेरा के लिए क्या किया है है ...

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
        willDecelerate:(BOOL)decelerate { 
    if (scrollView.contentOffset.y < -kRefreshDeltaY) { 
    animation = ^{ 
     [self setContentInset:UIEdgeInsetsMake(kRefreshDeltaY, 
                  0, 0, 0)]; 
    }; 

    [UIView animateWithDuration:0.3 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction 
        animations:animation 
        completion:completion]; 
    } // if 
} 

जब तक मैं बाहर subviews रखना या UITableView के फ्रेम परिवर्तन नहीं किया, यह ठीक से व्यवहार मेरे लिए।

0

मैंने रीफ्रेश करने के लिए इस पुल के लिए एक अलग तंत्र की कोशिश की। कृपया कोड

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    if (!reloading) 
    { 
     checkForRefresh = YES; // only check offset when dragging 
    } 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (reloading) return; 

    if (checkForRefresh) { 
     if (refreshHeaderView.isFlipped 
      && scrollView.contentOffset.y > -65.0f 
      && scrollView.contentOffset.y < 0.0f 
      && !reloading) { 
      [refreshHeaderView flipImageAnimated:YES]; 
      [refreshHeaderView setStatus:kPullToReloadStatus]; 


     } else if (!refreshHeaderView.isFlipped 
        && scrollView.contentOffset.y < -65.0f) { 
      [refreshHeaderView flipImageAnimated:YES]; 
      [refreshHeaderView setStatus:kReleaseToReloadStatus]; 

     } 
    } 
} 
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
        willDecelerate:(BOOL)decelerate 
{ 
    if (reloading) return; 

    if (scrollView.contentOffset.y <= - 65.0f) { 
     if([self.tableView.dataSource respondsToSelector: 
      @selector(reloadTableViewDataSource)]){ 
      [self showReloadAnimationAnimated:YES]; 
      [self reloadTableViewDataSource]; 
     } 
    } 
    checkForRefresh = NO; 
} 


- (void)reloadTableViewDataSource 
{ 
    [self performSelectorOnMainThread:@selector(refresh) withObject:nil waitUntilDone:NO]; 

} 
4

माइक के उत्तर ने मेरे लिए काम किया (लेकिन मैं इसे वोट नहीं दे सकता था या टिप्पणी नहीं कर सका)। ऐसा प्रतीत होता है कि एनीमेशन ब्लॉक में मेरे कोड को लपेटने से मेरे लिए झिलमिलाहट समाप्त हो गई।

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if (scrollView.contentOffset.y < 0 && scrollView.contentInset.top < 0) 
    { 
     // shows table header view 
     // setting inset without using animation block causes flicker 
     [UIView animateWithDuration:0.1 animations:^ 
     { 
      scrollView.contentInset = UIEdgeInsetsZero; 
     }]; 
    } 

    // hides table header view 
    if (scrollView.contentOffset.y > 44 && scrollView.contentInset.top == 0) 
    { 
     scrollView.contentInset = UIEdgeInsetsMake(-44, 0, 0, 0); 
    } 
} 
+0

इसके लिए धन्यवाद। मुझे लगता है कि 44 से आप हेडर के रूप में एक खोज बार टकराए जाने की कोशिश कर रहे थे? – MusiGenesis

+0

@MusiGenesis वास्तव में मैं एक खोज बार छुपा रहा था जिसे उपयोगकर्ता उपयोग करने के लिए नीचे खींच सकता था लेकिन उपयोगकर्ता अब इसका उपयोग नहीं कर रहा था। – sc0rp10n

+0

हाँ, वही यहाँ। – MusiGenesis