#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