视觉上改进 iOS 11leadingSwipeActions 的异步操作

Posted

技术标签:

【中文标题】视觉上改进 iOS 11leadingSwipeActions 的异步操作【英文标题】:Visually improve iOS 11 leadingSwipeActions for async actions 【发布时间】:2018-04-27 06:10:22 【问题描述】:

我想在用户向右滑动单元格时显示加载指示器,这会触发异步操作。在此操作进行期间,我想将标签隐藏在其中,保持单元格“内联”,而不是“可重新滑动”,并显示已经提到的指示器。

这是我目前得到的,它已经部分工作了:

override func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? 

let action = UIContextualAction(style: .normal, title: "My Action")  (action, view, handler: @escaping (Bool) -> Void) in

    // Getting UIButtonLabel, which is a subclass of UILabel
    guard let label = view as? UILabel else 
        return
    

    // Not used right now
    guard let superView = label.superview else 
        return
    


    // Try to hide the existing label
    label.text = "" // Doesn't work
    label.attributedText = nil // Doesn't work
    label.textColor = UIColor.clear // Doesn't work

    // Add a loading indicator at the position of the label, works!
    let loadingIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.white)
    loadingIndicator.translatesAutoresizingMaskIntoConstraints = false
    loadingIndicator.startAnimating()
    label.addSubview(loadingIndicator)
    NSLayoutConstraint.activate([
        loadingIndicator.centerXAnchor.constraint(equalTo: label.centerXAnchor),
        loadingIndicator.centerYAnchor.constraint(equalTo: label.centerYAnchor),
        loadingIndicator.heightAnchor.constraint(equalTo: label.heightAnchor, multiplier: 0.8),
        loadingIndicator.widthAnchor.constraint(equalTo: loadingIndicator.heightAnchor)
    ])

    self.viewModel.doAsyncAction(completionHandler:  (success) in
        loadingIndicator.stopAnimating()
        loadingIndicator.removeFromSuperview()
        handler(true)
    )))


action.backgroundColor = .darkGray

return UISwipeActionsConfiguration(actions:[action])

我可以在正确的位置添加一个加载指示器。我仍然无法隐藏标签。删除它或将其设置为 alpha 或隐藏状态将不起作用,因为加载指示器必须是它​​的子视图(用于 UITableView 的内部定位)。

此外,我可以通过延迟调用回调处理程序来阻止用户再次拉动操作,但我无法使单元格保持在“一级内联”滑动位置。当用户不滑动单元格并单击按钮而是决定将单元格全部滑动以触发操作时,这尤其难看。在这种情况下,我希望单元格自动移动到“一级内联”位置。

有人知道这个技巧吗?我已经在一些应用程序中看到了这一点。这类东西有没有常见的 UIKit 添加?

【问题讨论】:

【参考方案1】:

我发现的一种方法是禁用超级视图,它是 UIButton 的子类。

你可以得到它

            guard let superView = label.superview as? UIButton else 
                return
            

然后通过执行禁用它

            superView.isEnabled = false
            label.isEnabled = false
            label.isUserInteractionEnabled = false // Probably not required

这样,按钮内的标签会稍微褪色。此外,它还可以防止用户多次单击该按钮。

当用户“滑动到操作”时,它看起来不会那么好,因为操作按钮将保持在滑动位置。但也许这也是可以轻松调整的东西?!

【讨论】:

以上是关于视觉上改进 iOS 11leadingSwipeActions 的异步操作的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11 beta 10改进汇总 Safari新增双指操作等

在 iOS 11 中使用视觉框架进行对象跟踪

计算机视觉知识点——交并比(IoU)及其若干改进

《计算机视觉基础知识蓝皮书》第9篇 模型改进及期刊发表

ConViT:使用软卷积归纳偏置改进视觉变换器

芒果改进YOLOv7系列:全网首发最新 MobileViTv3 系列最强改进版本|轻量化Transformer视觉转换器,简单有效地融合了本地全局和输入特征,高效涨点