下拉并按住时 UIRefreshcontrol 抖动

2023-11-24

我在 tableviewcontroller 中创建了一个 UIRefreshcontrol,如下所示:

    refresh = [UIRefreshControl.alloc init];
    refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"];
    [refresh addTarget:self action:@selector(refreshChatsTableView) forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refresh;

问题是,当我把它拉得有点长时,桌子就会抖动,给人一种非常不愉快的用户界面体验。有人可以帮忙吗?仅在横向模式下才会出现此行为。

这是我的代码:

-UIRefreshControl  *refresh;

    -(void)viewDidLoad{
        [super viewDidLoad];
         arr= [[NSArray    alloc]initWithObjects:@"A",@"B",@"C",@"D",@"E",@"A",@"B",@"C",@"D",@"E", nil];

        //refresh control
        refresh = [UIRefreshControl.alloc init];
        refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to   Refresh"];
        [refresh addTarget:self action:@selector(refreshChatsTableView)  forControlEvents:UIControlEventValueChanged];
        self.refreshControl = refresh;
      }


    -(void)refreshChatsTableView{
        [refresh endRefreshing];
    }

    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return 1;
    }

    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
       return arr.count;
    }

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell =[[UITableViewCell alloc]init];
        cell.textLabel.text = [arr objectAtIndex:indexPath.row ];

        return cell;
    }

所以我遇到了同样的问题,我想出了一个解决方案。基本上,如果您将 tableView 拉得足够远并按住它,则 ValueChanged 控件事件将在用户释放触摸之前触发。如果此时刷新数据并重新加载tableView,表格就会跳起来。

为了解决这个问题,我最终独立于 ValueChanged 事件刷新表。相反,我使用该事件以及scrollView委托方法,仅在用户放手后刷新表格。

首先,在 viewDidLoad 中设置刷新控件。

override func viewDidLoad()
{
    super.viewDidLoad()

    refreshControl = UIRefreshControl()
    refreshControl?.addTarget(self, action: "refreshControlChanged", forControlEvents: UIControlEvents.ValueChanged)
}

ValueChanged 方法很简单。如果我们已经停止拖动(在快速向下滑动后发生这种情况),只需使用您自己的自定义方法刷新表格即可。

internal func refreshControlChanged()
{
    if !tableView.dragging
    {
        refresh()
    }
}

然后,您需要实现 didEndDragging。如果你下拉得足够远,refreshControl将会刷新,所以调用refresh。否则,您可能没有下拉得足够远,而是拖动了表格的不同部分,或者拖动得太快,以至于刷新控件 ValueChanged 事件尚未触发,并且它将刷新那里的表格。

override func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool)
{
    if refreshControl?.refreshing == true
    {
        refresh()
    }
}

就是这样。在您停止拖动表格之前,该表格不会重新加载,这避免了您注意到的抖动跳跃。我知道这已经有一年了,但我希望这可以帮助其他人在谷歌上遇到这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

下拉并按住时 UIRefreshcontrol 抖动 的相关文章

随机推荐