【问题标题】:How do I programmatically slide the UITableView down to reveal the underlying UIRefreshControl如何以编程方式向下滑动 UITableView 以显示底层 UIRefreshControl
【发布时间】:2012-12-14 11:09:28
【问题描述】:

当我以编程方式更新表格时,如何显示 UIRefreshControl? 使用 [self.refreshControl beginRefreshing] 使微调器动画但不显示它。

【问题讨论】:

    标签: ios6 uitableview uirefreshcontrol


    【解决方案1】:

    您必须自己手动更改contentOffsetUITableView。请务必考虑contentInset.top。它应该很简单:

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

    【讨论】:

    • 我注意到,如果您在调用 endRefreshing:[myTableView setContentOffset:CGPointZero animated:YES]; 后不重置 contentOffset,这往往会导致单元格绘制问题
    • 要在 iOS 8 或 iOS 9 中修复该问题,只需从 viewWillAppear: 方法调用 [self.refreshControl beginRefreshing],而不是从 viewDidLoad: 调用。
    • 还有谁遇到使用 beginRefresh() 触发刷新时纺车颜色错误的问题?在我的背景为深色的情况下,它是黑色的,但在通过拉动触发刷新时它是白色的。设置色调没有帮助。
    • @AlexanderPerechnev 它在 ios 9 中的 viewDidLoad 中对我有用,但现在在 iOS 10 中它甚至在 viewWillAppear 中都不起作用
    • @sofacoder 是的,我遇到了同样的问题。当从 viewWillAppear: 调用 beginRefreshing 时,色调颜色为黑色,我所做的任何事情都不会改变它。从那时起更改 tintColor 有效,但不适用于第一次显示。
    【解决方案2】:

    这样就可以了

    - (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){
    
            }];
    
        }
    }
    

    【讨论】:

    • 显然你需要在tableview动画的完成块内调用beginRefreshing,或者在动画调用之后,否则你设置的refreshControl的tintColor会被忽略。 stackoverflow.com/a/20383030/903544
    【解决方案3】:

    对于 Swift 3,这是我根据 Peter 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)
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      对于 Swift 5,这是我唯一可以使用的版本。

      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)
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-12
        • 2017-07-06
        • 1970-01-01
        相关资源
        最近更新 更多