CAGradientLayer не подходит идеально для границ UITableViewCell

#swift #uitableview #cashapelayer #cagradientlayer

#swift #uitableview #cashapelayer #cagradientlayer

Вопрос:

я разрабатываю простой UITableView с пользовательской UITableViewCell с помощью файла Xib, который я добавил в MainView и прикрепил к contentView, чтобы добавить все мои представления в MainView, как показано ниже, макет UITableViewCell

когда я пытаюсь добавить CAGradientLayer в MainView, он не подходит идеально для границ MainView, как я показываю ниже, что происходит на симуляторе, я использую этот фрагмент кода для добавления CAGradientLayer

     override func awakeFromNib() {
    super.awakeFromNib()
    
      let gradient = CAGradientLayer()
      mainView.layer.cornerRadius = 10
      gradient.frame = mainView.frame
      gradient.colors = [ColorCompatibility.gradEnd.cgColor, ColorCompatibility.gradStart.cgColor]
      gradient.endPoint = CGPoint(x: 0.5, y: 1)
      gradient.startPoint = CGPoint(x: 0.5, y: 0)
     // gradient.cornerRadius = 20
      
      gradient.shadowColor = ColorCompatibility.systemBackground.cgColor
      gradient.shadowOpacity = 0.8
      gradient.shadowOffset = .zero
      gradient.shadowRadius = 5
      gradient.shadowPath = UIBezierPath(roundedRect: mainView.layer.bounds, cornerRadius: 20).cgPath
      gradient.shouldRasterize = true
      gradient.rasterizationScale = UIScreen.main.scale
   
      contentView.layer.insertSublayer(gradient, at: 0)
   
    
}
  

как я могу это исправить?

Комментарии:

1. что такое MainView?

2. Не должно быть contentView вместо mainView ?

3. MainView — это вторичный вид, который я добавил в contentView, чтобы теперь напрямую использовать contentView.

4. что такое фрейм MainView?

5. contentview на 10 точек, вставленных с каждой стороны

Ответ №1:

Здесь две проблемы. Во-первых, в awakeFromNib ячейке (и ее представлении содержимого), скорее всего, нет правильного фрейма, поэтому вы можете использовать другой хук жизненного цикла, где фрейм правильный, но тогда вы столкнетесь с проблемами при повороте устройства, поэтому фрейм ячейки изменяется во время выполнения.

Я бы предложил обновить рамку градиентных слоев layoutSublayers(of:) . Предположим, вы создали свойство для слоя с именем gradient :

 override func layoutSublayers(of layer: CALayer) {
    super.layoutSublayers(of: layer)

    gradient.frame = mainView.bounds
}
  

Комментарии:

1. это действительно работает, но проблема в том, что он фиксирует фрейм только тогда, когда я начинаю прокручивать

2. большое вам спасибо, я исправил это с помощью layoutIfNeeded() в viewdidapear