How do I programmatically slide the UITableView down to reveal the underlying UIRefreshControl

后端 未结 4 1853
天涯浪人
天涯浪人 2021-02-04 01:06

How can I reveal the UIRefreshControl when I update the table programmatically? Using [self.refreshControl beginRefreshing] make the spinner animate but does not reveal it.

相关标签:
4条回答
  • 2021-02-04 01:33

    You'll have to manually change the contentOffset of your UITableView yourself. Be sure to account for the contentInset.top. It should be something as simple as:

    CGPoint newOffset = CGPointMake(0, -[myTableView contentInset].top);
    [myTableView setContentOffset:newOffset animated:YES];
    
    0 讨论(0)
  • 2021-02-04 01:33

    This will do the trick

    - (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){
    
            }];
    
        }
    }
    
    0 讨论(0)
  • 2021-02-04 01:35

    For Swift 5, this is the only working version for me.

    extension UIRefreshControl {
    
        func beginRefreshingManually() {
            if let scrollView = superview as? UIScrollView {
                scrollView.setContentOffset(CGPoint(x: 0, y: scrollView.contentOffset.y - frame.height), animated: false)
            }
            beginRefreshing()
            sendActions(for: .valueChanged)
        }
    
    }
    
    0 讨论(0)
  • 2021-02-04 01:38

    For Swift 3, this is what I have based on Peter Lapisu's answer:

    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)
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题