UITableViewCell с чистым фоном и цветным содержимым ViewView - PullRequest
0 голосов
/ 04 марта 2019

Я хочу создать «фальшивый» интервал вокруг моего UITableViewCell, и я делаю это, вставляя фрейм contentView по 10 каждый [Я на самом деле добавляю собственный вид поверх contentView и вставляю его с помощью10].Похоже, что contentView является единственным видимым представлением.Это выглядит очень хорошо, и я также устанавливаю и настраиваю рамку selectedBackgroundView для своей ячейки, так что при выборе будет выделена только «видимая» область.

Теперь проблема заключается в следующем:

Если я выбираю ячейку, она мигает с UIColor.darkGray, как указано в моем selectedBackgroundView.Затем в течение короткого промежутка времени в анимации фон моей ячейки полностью не виден, прежде чем он снова начинает мигать.Таким образом, анимация не выглядит плавной.

Это относится к представлению содержимого:

  1. Цвет фона
  2. darkGray (selectedBackgroundView)
  3. ОчиститьЦвет
  4. Цвет фона

Кто-нибудь знает, могу ли я исправить это поведение, сохраняя выделение как вещь?

Я создал 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и оживить его сам.

1 Ответ

0 голосов
/ 04 марта 2019

Вы, вероятно, хотите переопределить setSelected в своей ячейке.Например:

override func setSelected(_ selected: Bool, animated: Bool) {
    //If we don't get the contentView's backgroundColor here and then reset it after the call to super.setSelected, the contentView's backgroundColor will "disappear" when the cell is selected
    let contentViewColor = contentView.backgroundColor
    super.setSelected(selected, animated: animated)
    contentView.backgroundColor = contentViewColor
}

Когда выбрана ячейка, для свойств backgroundColor для ВСЕХ подпредставлений ячейки устанавливается цвет выделения, который перезаписывает любые свойства backgroundColor, которые вы установили самостоятельно.Поэтому вам может потребоваться вручную установить backgroundColor вашего contentView здесь, чтобы получить желаемое поведение.

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