Я хочу создать «фальшивый» интервал вокруг моего UITableViewCell
, и я делаю это, вставляя фрейм contentView по 10 каждый [Я на самом деле добавляю собственный вид поверх contentView и вставляю его с помощью10].Похоже, что contentView является единственным видимым представлением.Это выглядит очень хорошо, и я также устанавливаю и настраиваю рамку selectedBackgroundView
для своей ячейки, так что при выборе будет выделена только «видимая» область.
Теперь проблема заключается в следующем:
Если я выбираю ячейку, она мигает с UIColor.darkGray
, как указано в моем selectedBackgroundView
.Затем в течение короткого промежутка времени в анимации фон моей ячейки полностью не виден, прежде чем он снова начинает мигать.Таким образом, анимация не выглядит плавной.
Это относится к представлению содержимого:
- Цвет фона
- darkGray (selectedBackgroundView)
- ОчиститьЦвет
- Цвет фона
Кто-нибудь знает, могу ли я исправить это поведение, сохраняя выделение как вещь?
Я создал gif из анимации:https://imgur.com/vkfA62w
Вот мой код:
class BasicTableViewCell : UITableViewCell {
public var basicContentView: UIView = UIView(frame: .zero)
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: .default, reuseIdentifier: reuseIdentifier)
self.tintColor = UIColor.white
self.contentView.backgroundColor = UIColor.clear
self.basicContentView.backgroundColor = UIColor.barTintColor
self.basicContentView.layer.masksToBounds = false
self.basicContentView.layer.cornerRadius = 10.0
self.basicContentView.translatesAutoresizingMaskIntoConstraints = false
self.contentView.addSubview(self.basicContentView)
self.basicContentView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: 10.0).isActive = true
self.basicContentView.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -10.0).isActive = true
self.basicContentView.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 10.0).isActive = true
let bottomConstraint = self.basicContentView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -10.0)
bottomConstraint.priority = UILayoutPriority(999)
bottomConstraint.isActive = true
let selectedView: UIView = UIView(frame: .zero)
selectedView.backgroundColor = UIColor.darkGray
selectedView.layer.cornerRadius = 10.0
selectedView.layer.masksToBounds = false
self.selectedBackgroundView = selectedView
}
override func layoutSubviews() {
super.layoutSubviews()
// only for selectedBackgroundView, contentView raised other issues
let contentViewFrame = self.contentView.frame
let insetContentViewFrame = contentViewFrame.inset(by: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10))
self.selectedBackgroundView?.frame = insetContentViewFrame
}
}
Я уже знаю, в чем проблема, на основе: Объяснение яблок selectedBackgroundView
добавлено к contentView
и затем исчезает перед удалением из contentView
, а затем basicContentView
внезапно снова становится видимым, что вызывает ошибку.
Вот мое исправление
override func setSelected(_ selected: Bool, animated: Bool) {
if selected {
self.basicSelectedBackgroundView.alpha = 1.0
self.basicContentView.insertSubview(self.basicSelectedBackgroundView, at: 0)
} else {
guard self.basicSelectedBackgroundView.superview != nil else {
return
}
if animated {
UIView.animate(withDuration: 0.5, delay: 0.0, options: .allowUserInteraction, animations: {
self.basicSelectedBackgroundView.alpha = 0.0
}) { (finished: Bool) in
if finished {
self.basicSelectedBackgroundView.removeFromSuperview()
}
}
} else {
self.basicSelectedBackgroundView.alpha = 0.0
self.basicSelectedBackgroundView.removeFromSuperview()
}
}
}
Я переопределяю setSelectedи оживить его сам.