UIScrollView неожиданное поведение в UICollectionViewCell - PullRequest
0 голосов
/ 03 февраля 2020

Я реализую пользовательскую функцию «проведите по удалению» для UICollectionViewCell. У меня есть пользовательский UIView со следующей иерархией представлений:

UIView
- UIScrollView
-- UIStackView (horizontal)
--- UIView (content section)
--- UIView ('remove' section)

Когда представление смахивания для удаления центрируется в ViewController самостоятельно, оно работает как положено (см. Скриншоты ниже):

Снимок экрана 1 Снимок экрана 2

Тем не менее, когда я вставляю представление смахивания для удаления в UICollectionViewCell (что является моей целью использование), весь вид прокрутки имеет дополнительное смещение вправо (см. скриншоты ниже):

Снимок экрана 3 Снимок экрана 4

Когда В инспекторе пользовательского интерфейса Xcode само UIScrollView кажется смещенным вправо, как будто представление прокрутки перемещается вправо с той же скоростью, с которой прокручивается его содержимое.

Прокрутка для удаления представление реализовано следующим образом:

class SwipeToDeleteCell: UIView {

private let labelText = NSLocalizedString("Remove", comment: "")
private lazy var contentView: UIView = {
    let contentView = self.subviews.first ?? UIView()
    contentView.translatesAutoresizingMaskIntoConstraints = false
    return contentView
}()
private lazy var scrollView: UIScrollView = {
    let scrollView = UIScrollView()
    scrollView.showsHorizontalScrollIndicator = false
    scrollView.showsVerticalScrollIndicator = false
    scrollView.bounces = false
    scrollView.translatesAutoresizingMaskIntoConstraints = false
    return scrollView
}()
private lazy var stackView: UIStackView = {
    let stackView = UIStackView()
    stackView.translatesAutoresizingMaskIntoConstraints = false
    stackView.axis = .horizontal
    stackView.alignment = .fill
    stackView.distribution = .fill
    return stackView
}()
private lazy var redView: UIView = {
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.clipsToBounds = true
    view.backgroundColor = .red
    return view
}()
private lazy var label: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.text = labelText
    label.textColor = .white
    return label
}()
private let labelMargin: CGFloat = 16
private var previousScrollPosition: CGFloat = 0
private var labelLeadingConstraint = NSLayoutConstraint()

weak var delegate: SwipeRemoveViewDelegate?

override init(frame: CGRect) {
    super.init(frame: frame)
    commonInit()
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    commonInit()
}

private func commonInit() {
    setupViews()
    scrollView.delegate = self
}

private func setupViews() {
    translatesAutoresizingMaskIntoConstraints = false

    redView.addSubview(label)
    NSLayoutConstraint.activate([
        label.centerYAnchor.constraint(equalTo: redView.centerYAnchor)
    ])

    labelLeadingConstraint = label.leadingAnchor.constraint(equalTo: redView.leadingAnchor, constant: labelMargin)
    labelLeadingConstraint.isActive = false

    stackView.addArrangedSubview(contentView)
    stackView.addArrangedSubview(redView)
    scrollView.addSubview(stackView)
    addSubview(scrollView)
    NSLayoutConstraint.activate([
        scrollView.frameLayoutGuide.topAnchor.constraint(equalTo: self.topAnchor),
        scrollView.frameLayoutGuide.bottomAnchor.constraint(equalTo: self.bottomAnchor),
        scrollView.frameLayoutGuide.leadingAnchor.constraint(equalTo: self.leadingAnchor),
        scrollView.frameLayoutGuide.trailingAnchor.constraint(equalTo: self.trailingAnchor)
    ])
    NSLayoutConstraint.activate([
        stackView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor),
        stackView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor),
        stackView.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor),
        stackView.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor),
        stackView.heightAnchor.constraint(equalTo: scrollView.frameLayoutGuide.heightAnchor)
    ])
    NSLayoutConstraint.activate([
        contentView.widthAnchor.constraint(equalTo: scrollView.frameLayoutGuide.widthAnchor),
        redView.widthAnchor.constraint(equalTo: scrollView.frameLayoutGuide.widthAnchor)
    ])

    let labelLeadingAnchor = label.leadingAnchor.constraint(greaterThanOrEqualTo: redView.leadingAnchor,
                                                            constant: labelMargin)
    labelLeadingAnchor.priority = .defaultHigh
    labelLeadingAnchor.isActive = true
    let labelTrailingAnchor = label.trailingAnchor.constraint(
        greaterThanOrEqualTo: scrollView.frameLayoutGuide.trailingAnchor,
        constant: -labelMargin)
    labelTrailingAnchor.priority = .required
    labelTrailingAnchor.isActive = true
}

}

Является ли тот факт, что пользовательское представление встроено в UICollectionViewCell, вызывает этот эффект, или здесь происходит что-то еще?

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