From 6c5c9fd42e093d8eeb037f9681bd223ce4df91c0 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 11 Aug 2023 04:03:52 +0200 Subject: [PATCH] Various fixes --- .../Sources/MediaEditorScreen.swift | 2 +- .../Sources/StoryItemContentComponent.swift | 41 ++++++++++++------- .../Sources/StoryItemLoadingEffectView.swift | 34 +++++++-------- 3 files changed, 44 insertions(+), 33 deletions(-) diff --git a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift index 5aa7ee0b44..58ec4361f8 100644 --- a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift +++ b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift @@ -1602,7 +1602,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate privacy: EngineStoryPrivacy(base: .everyone, additionallyIncludePeers: []), timeout: 86400, isForwardingDisabled: false, - pin: false + pin: true ) } diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift index 20099333b7..7d4e1592a1 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift @@ -719,7 +719,7 @@ final class StoryItemContentComponent: Component { if let current = self.loadingEffectView { loadingEffectView = current } else { - loadingEffectView = StoryItemLoadingEffectView(effectAlpha: 0.1, duration: 1.0, hasBorder: true, playOnce: false) + loadingEffectView = StoryItemLoadingEffectView(effectAlpha: 0.1, borderAlpha: 0.2, duration: 1.0, hasCustomBorder: true, playOnce: false) self.loadingEffectView = loadingEffectView self.addSubview(loadingEffectView) } @@ -743,21 +743,21 @@ final class StoryItemContentComponent: Component { if let current = self.mediaAreasEffectView { mediaAreasEffectView = current } else { - mediaAreasEffectView = StoryItemLoadingEffectView(effectAlpha: 0.25, duration: 1.5, hasBorder: false, playOnce: true) + mediaAreasEffectView = StoryItemLoadingEffectView(effectAlpha: 0.35, borderAlpha: 0.45, gradientWidth: 150.0, duration: 1.5, hasCustomBorder: false, playOnce: true) self.mediaAreasEffectView = mediaAreasEffectView self.addSubview(mediaAreasEffectView) } mediaAreasEffectView.update(size: availableSize, transition: transition) - let maskView: UIView - if let current = mediaAreasEffectView.mask { - maskView = current + let maskLayer: CALayer + if let current = mediaAreasEffectView.layer.mask { + maskLayer = current } else { - maskView = UIView(frame: CGRect(origin: .zero, size: availableSize)) - mediaAreasEffectView.mask = maskView + maskLayer = CALayer() + mediaAreasEffectView.layer.mask = maskLayer } - if maskView.subviews.isEmpty { + if (maskLayer.sublayers ?? []).isEmpty { let referenceSize = availableSize for mediaArea in component.item.mediaAreas { guard case .venue = mediaArea else { @@ -765,15 +765,26 @@ final class StoryItemContentComponent: Component { } let size = CGSize(width: mediaArea.coordinates.width / 100.0 * referenceSize.width, height: mediaArea.coordinates.height / 100.0 * referenceSize.height) let position = CGPoint(x: mediaArea.coordinates.x / 100.0 * referenceSize.width, y: mediaArea.coordinates.y / 100.0 * referenceSize.height) + let cornerRadius = size.height * 0.18 - let view = UIView() - view.backgroundColor = .white - view.bounds = CGRect(origin: .zero, size: size) - view.center = position - view.layer.cornerRadius = size.height * 0.18 - maskView.addSubview(view) + let layer = CALayer() + layer.backgroundColor = UIColor.white.cgColor + layer.bounds = CGRect(origin: .zero, size: size) + layer.position = position + layer.cornerRadius = cornerRadius + maskLayer.addSublayer(layer) - view.transform = CGAffineTransformMakeRotation(mediaArea.coordinates.rotation * Double.pi / 180.0) + let borderLayer = CAShapeLayer() + borderLayer.strokeColor = UIColor.white.cgColor + borderLayer.fillColor = UIColor.clear.cgColor + borderLayer.lineWidth = 2.0 + borderLayer.path = CGPath(roundedRect: CGRect(origin: .zero, size: size), cornerWidth: cornerRadius, cornerHeight: cornerRadius, transform: nil) + borderLayer.bounds = CGRect(origin: .zero, size: size) + borderLayer.position = position + mediaAreasEffectView.borderMaskLayer.addSublayer(borderLayer) + + layer.transform = CATransform3DMakeRotation(mediaArea.coordinates.rotation * Double.pi / 180.0, 0.0, 0.0, 1.0) + borderLayer.transform = layer.transform } } } else if let mediaAreasEffectView = self.mediaAreasEffectView { diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemLoadingEffectView.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemLoadingEffectView.swift index c36392cc32..aa7e12031e 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemLoadingEffectView.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemLoadingEffectView.swift @@ -5,8 +5,8 @@ import ComponentFlow import Display final class StoryItemLoadingEffectView: UIView { - private let effectAlpha: CGFloat private let duration: Double + private let hasCustomBorder: Bool private let playOnce: Bool private let hierarchyTrackingLayer: HierarchyTrackingLayer @@ -16,18 +16,18 @@ final class StoryItemLoadingEffectView: UIView { private let borderGradientView: UIImageView private let borderContainerView: UIView - private let borderMaskLayer: SimpleShapeLayer + let borderMaskLayer: SimpleShapeLayer private var didPlayOnce = false - init(effectAlpha: CGFloat, duration: Double, hasBorder: Bool, playOnce: Bool) { + init(effectAlpha: CGFloat, borderAlpha: CGFloat, gradientWidth: CGFloat = 200.0, duration: Double, hasCustomBorder: Bool, playOnce: Bool) { self.hierarchyTrackingLayer = HierarchyTrackingLayer() - self.effectAlpha = effectAlpha self.duration = duration + self.hasCustomBorder = hasCustomBorder self.playOnce = playOnce - self.gradientWidth = 200.0 + self.gradientWidth = gradientWidth self.backgroundView = UIImageView() self.borderGradientView = UIImageView() @@ -75,15 +75,13 @@ final class StoryItemLoadingEffectView: UIView { context.drawLinearGradient(gradient, start: CGPoint(x: 0.0, y: 0.0), end: CGPoint(x: size.width, y: 0.0), options: CGGradientDrawingOptions()) }) } - self.backgroundView.image = generateGradient(self.effectAlpha) + self.backgroundView.image = generateGradient(effectAlpha) self.addSubview(self.backgroundView) - if hasBorder { - self.borderGradientView.image = generateGradient(self.effectAlpha + 0.1) - self.borderContainerView.addSubview(self.borderGradientView) - self.addSubview(self.borderContainerView) - self.borderContainerView.layer.mask = self.borderMaskLayer - } + self.borderGradientView.image = generateGradient(borderAlpha) + self.borderContainerView.addSubview(self.borderGradientView) + self.addSubview(self.borderContainerView) + self.borderContainerView.layer.mask = self.borderMaskLayer } required init?(coder: NSCoder) { @@ -107,11 +105,13 @@ final class StoryItemLoadingEffectView: UIView { if self.backgroundView.bounds.size != size { self.backgroundView.layer.removeAllAnimations() - self.borderMaskLayer.fillColor = nil - self.borderMaskLayer.strokeColor = UIColor.white.cgColor - let lineWidth: CGFloat = 3.0 - self.borderMaskLayer.lineWidth = lineWidth - self.borderMaskLayer.path = UIBezierPath(roundedRect: CGRect(origin: CGPoint(), size: size).insetBy(dx: lineWidth * 0.5, dy: lineWidth * 0.5), cornerRadius: 12.0).cgPath + if !self.hasCustomBorder { + self.borderMaskLayer.fillColor = nil + self.borderMaskLayer.strokeColor = UIColor.white.cgColor + let lineWidth: CGFloat = 3.0 + self.borderMaskLayer.lineWidth = lineWidth + self.borderMaskLayer.path = UIBezierPath(roundedRect: CGRect(origin: CGPoint(), size: size).insetBy(dx: lineWidth * 0.5, dy: lineWidth * 0.5), cornerRadius: 12.0).cgPath + } } transition.setFrame(view: self.backgroundView, frame: CGRect(origin: CGPoint(x: -self.gradientWidth, y: 0.0), size: CGSize(width: self.gradientWidth, height: size.height)))