diff --git a/iOS/Article/ArticleViewController.swift b/iOS/Article/ArticleViewController.swift index 95b7d21f0..52b2faf39 100644 --- a/iOS/Article/ArticleViewController.swift +++ b/iOS/Article/ArticleViewController.swift @@ -520,9 +520,17 @@ private extension ArticleViewController { let base64Image = String(clickMessage.imageURL.suffix(from: range.upperBound)) if let imageData = Data(base64Encoded: base64Image), let image = UIImage(data: imageData) { + let y = CGFloat(clickMessage.y) + webView.safeAreaInsets.top let rect = CGRect(x: CGFloat(clickMessage.x), y: y, width: CGFloat(clickMessage.width), height: CGFloat(clickMessage.height)) transition.originFrame = webView.convert(rect, to: nil) + + if navigationController?.navigationBar.isHidden ?? false { + transition.maskFrame = webView.convert(webView.frame, to: nil) + } else { + transition.maskFrame = webView.convert(webView.safeAreaLayoutGuide.layoutFrame, to: nil) + } + transition.originImage = image coordinator.showFullScreenImage(image: image, transitioningDelegate: self) diff --git a/iOS/Article/ImageTransition.swift b/iOS/Article/ImageTransition.swift index 2dc991077..0c17a59b9 100644 --- a/iOS/Article/ImageTransition.swift +++ b/iOS/Article/ImageTransition.swift @@ -14,6 +14,7 @@ class ImageTransition: NSObject, UIViewControllerAnimatedTransitioning { private let duration = 0.4 var presenting = true var originFrame: CGRect! + var maskFrame: CGRect! var originImage: UIImage! init(controller: ArticleViewController) { @@ -67,11 +68,22 @@ class ImageTransition: NSObject, UIViewControllerAnimatedTransitioning { imageView.frame = imageController.zoomedFrame let fromView = transitionContext.view(forKey: .from)! + let windowFrame = fromView.window!.frame fromView.removeFromSuperview() let toView = transitionContext.view(forKey: .to)! transitionContext.containerView.addSubview(toView) - transitionContext.containerView.addSubview(imageView) + + let maskingView = UIView() + + let fullMaskFrame = CGRect(x: windowFrame.minX, y: maskFrame.minY, width: windowFrame.width, height: maskFrame.height) + let path = UIBezierPath(rect: fullMaskFrame) + let maskLayer = CAShapeLayer() + maskLayer.path = path.cgPath + maskingView.layer.mask = maskLayer + + maskingView.addSubview(imageView) + transitionContext.containerView.addSubview(maskingView) UIView.animate( withDuration: duration,