2012-12-29 26 views

回答

20

您必須親自手動更改您的UITableViewcontentOffset。一定要考慮到contentInset.top。它應該是簡單的東西如:

CGPoint newOffset = CGPointMake(0, -[myTableView contentInset].top); 
[myTableView setContentOffset:newOffset animated:YES]; 
+3

我我們注意到如果你在調用'endRefreshing'後沒有重置contentOffset,就會導致單元繪製問題:'[myTableView setContentOffset:CGPointZero animated:YES];' –

+4

不適用於iOS8 – AlKozin

+2

不能在ios 9中工作。 – cdub

17

這將這樣的伎倆

- (void)beginRefreshingTableView { 

    [self.refreshControl beginRefreshing]; 

    // check if contentOffset is zero 
    if (fabsf(self.tableView.contentOffset.y) < FLT_EPSILON) { 

     [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^(void){ 

      self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height); 

     } completion:^(BOOL finished){ 

     }]; 

    } 
} 
+1

顯然,您需要在tableview動畫的完成塊內或調用動畫之後調用'beginRefreshing',否則將忽略由您設置的refreshControl的tintColor。 http://stackoverflow.com/a/20383030/903544 –

8

對於斯威夫特3,這是我根據彼得Lapisu的回答是:

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.refreshControl?.addTarget(self, action: #selector(refresh), forControlEvents: UIControlEvents.ValueChanged) 
    // ... 
} 

func refresh(sender:AnyObject) { 
    self.refreshControl?.beginRefreshing() 

    if let yOffsetTable = self.tableView?.contentOffset.y { 
     if yOffsetTable < CGFloat(Float.ulpOfOne) { 
      UIView.animate(withDuration: 0.25, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState, animations: { 
       if let refreshControlHeight = self.refreshControl?.frame.height { 
        self.tableView?.contentOffset = CGPoint(x: 0, y: -refreshControlHeight) 
       } 
      }, completion: nil) 
     } 
    } 
} 
相關問題