Визуально улучшить iOS 11, приводя SwipeActions к асинхронным действиям - PullRequest
0 голосов
/ 27 апреля 2018

Я хотел бы показать индикатор загрузки, когда пользователь проводит ячейку вправо, что вызывает асинхронное действие. Пока это действие продолжается, я хотел бы скрыть метку внутри, оставить ячейку «встроенной», а не «повторной прокруткой» и показать уже упомянутый индикатор.

Это то, что я получил до сих пор, и это уже частично работает:

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

}

Я могу добавить индикатор загрузки в правильном положении. Я до сих пор не могу скрыть ярлык. Удаление его или настроек его альфа или скрытого состояния не будет работать, так как индикатор загрузки должен быть его подвидом (для внутреннего позиционирования UITableView).

Кроме того, я могу помешать пользователю снова выполнить действие, вызвав обработчик обратного вызова с опозданием, но я не могу заставить ячейку сохраняться в этой позиции "одноуровневого встраивания". Это особенно уродливо, когда пользователь не проводит пальцем по ячейке и не нажимает кнопку, но решает провести по ячейке, чтобы вызвать действие. В этом случае я бы хотел, чтобы ячейка автоматически переместилась в положение «на один уровень».

Кто-нибудь знает хитрость для этого? Я видел это уже в некоторых приложениях. Есть ли общее дополнение UIKit для такого рода вещей?

1 Ответ

0 голосов
/ 02 мая 2018

Один из способов узнать, что я обнаружил, - отключить суперпредставление, которое является подклассом UIButton.

Вы можете получить его по

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

, а затем отключите его, выполнив

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

Таким образом, метка внутри кнопки выглядит слегка блеклой. Кроме того, он не позволяет пользователю нажимать кнопку несколько раз.

Когда пользователь «движется к действию», он будет выглядеть не так хорошо, поскольку кнопка действия останется в скользящем положении. Но, может быть, это тоже легко настроить?!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...