Я создаю видео из изображений и добавляю к ним оверлей. Проблема в том, когда я пытаюсь добавить CATextLayer к видео. Текст в пикселях, посмотрите на изображение
![image](https://i.stack.imgur.com/dDqkt.png)
Этот код используется для генерации CATextLayer:
private func generateTextLayer(for text: String, at frame: CGRect, in layer: CALayer) -> CATextLayer {
let textLayer = CATextLayer()
textLayer.frame = frame.integral
textLayer.contentsScale = UIScreen.main.scale
textLayer.isWrapped = true
textLayer.isHidden = true
textLayer.foregroundColor = UIColor.white.cgColor
textLayer.backgroundColor = UIColor.clear.cgColor
let fontHeight = resolution.fontHeight
textLayer.font = UIFont.systemFont(ofSize: fontHeight)
textLayer.fontSize = fontHeight
textLayer.string = text
textLayer.truncationMode = .end
textLayer.alignmentMode = .center
textLayer.contentsScale = UIScreen.main.scale
layer.addSublayer(textLayer)
return textLayer
}
И этот код используется для генерации CALayer с изображением:
private func generateImageLayer(for image: CGImage?, at frame: CGRect, in layer: CALayer) -> CALayer {
let imageLayer = CALayer()
imageLayer.frame = frame.integral
imageLayer.contents = image
imageLayer.contentsGravity = .resizeAspectFill
imageLayer.isHidden = true
imageLayer.backgroundColor = UIColor.clear.cgColor
layer.addSublayer(imageLayer)
return imageLayer
}
Слой изображения скрыт из-за анимации различных слоев изображения в сгенерированном видео. Это код, используемый для генерации слоя:
let size = backgroundTrack.naturalSize.applying(backgroundTrack.preferredTransform)
let parentlayer = CALayer()
parentlayer.frame = CGRect(origin: .zero, size: size).integral
parentlayer.backgroundColor = UIColor.black.cgColor
parentlayer.isOpaque = true
let backgroundVideoLayer = CALayer()
backgroundVideoLayer.frame = parentlayer.bounds
backgroundVideoLayer.backgroundColor = UIColor.black.cgColor
backgroundVideoLayer.isOpaque = true
parentlayer.addSublayer(backgroundVideoLayer)
var currentTime: Double = 0
for source in videoSources {
// This will generate blurred background layer
let blurrLayer = generateImageLayer(for: source.blurredImage, at: backgroundVideoLayer.bounds, in: backgroundVideoLayer)
blurrLayer.contentsGravity = .resizeAspectFill
// Adds image to blurrLayer
if let image = source.image {
let frame = calculateFrame(for: image.size)
let imageLayer = generateImageLayer(for: image.cgImage, at: frame, in: blurrLayer)
imageLayer.isHidden = false
Animations.fadeInOut(layer: blurrLayer, beginTime: currentTime, duration: duration.value)
}
// Adds CATextLayer
if let text = source.title {
let frame = parentlayer.bounds.offsetBy(dx: 0, dy: 100)
let titleLayer = generateTextLayer(for: text, at: frame, in: parentlayer)
Animations.fadeInOut(layer: titleLayer, beginTime: currentTime, duration: duration.value)
}
currentTime += duration.value
}
Я попытался установить для rasterizationScale значение UIScreen.main.scale, shouldRasterize в значение true, contentsScale в UIScreen.main.scale, все виды различных параметров, даже пробовал делать снимки UILabel и установив его как изображение (даже локально сохранил изображение и проверил его, качество было хорошим), но в результате снова получается пиксельная запись.
Animate fadeInOut - это в основном три анимации: одна устанавливает скрытый параметр на true или false, а другая добавляет анимацию открытия CATransition для входа и выхода между слоями.
static func fadeInOut(layer: CALayer, beginTime: Double, duration: Double, skipEntry: Bool = false) {
let t = beginTime < 1 ? -0.0001 : beginTime
let d = beginTime < 1 ? duration + 0.0001 : duration - 0.0001
if !skipEntry {
let entryTransition = CATransition()
entryTransition.beginTime = t
entryTransition.duration = 0.5
entryTransition.type = CATransitionType.reveal
entryTransition.subtype = CATransitionSubtype.fromTop
entryTransition.isRemovedOnCompletion = false
layer.add(entryTransition, forKey: "entry")
}
let exitTransition = CATransition()
exitTransition.beginTime = d - 0.5
exitTransition.duration = 0.5
exitTransition.startProgress = 1
exitTransition.endProgress = 0
exitTransition.type = CATransitionType.reveal
exitTransition.subtype = CATransitionSubtype.fromTop
exitTransition.isRemovedOnCompletion = false
layer.add(exitTransition, forKey: "exit")
let fadeInOutAnimation = CABasicAnimation(keyPath: "hidden")
fadeInOutAnimation.fromValue = false
fadeInOutAnimation.toValue = false
fadeInOutAnimation.beginTime = t
fadeInOutAnimation.duration = d
fadeInOutAnimation.isRemovedOnCompletion = false
layer.add(fadeInOutAnimation, forKey: "opacity")
}
Прежде чем пометить мой вопрос как уже увиденный и получивший ответ, я потратил много времени, пытаясь найти возможные результаты в Google, и перепробовал множество вещей, но результаты все те же.