Я реализую пользовательскую функцию «проведите по удалению» для 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
, вызывает этот эффект, или здесь происходит что-то еще?