diff --git a/ImageSlideshow/Classes/Core/ImageSlideshow.swift b/ImageSlideshow/Classes/Core/ImageSlideshow.swift index dd90a139..898a5bf2 100644 --- a/ImageSlideshow/Classes/Core/ImageSlideshow.swift +++ b/ImageSlideshow/Classes/Core/ImageSlideshow.swift @@ -242,6 +242,10 @@ open class ImageSlideshow: UIView { scrollView.showsHorizontalScrollIndicator = false scrollView.showsVerticalScrollIndicator = false scrollView.autoresizingMask = autoresizingMask + if UIApplication.shared.userInterfaceLayoutDirection == .rightToLeft { + scrollView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi)) + } + if #available(iOS 11.0, *) { scrollView.contentInsetAdjustmentBehavior = .never } diff --git a/ImageSlideshow/Classes/Core/ImageSlideshowItem.swift b/ImageSlideshow/Classes/Core/ImageSlideshowItem.swift index cb83f027..62f056a1 100644 --- a/ImageSlideshow/Classes/Core/ImageSlideshowItem.swift +++ b/ImageSlideshow/Classes/Core/ImageSlideshowItem.swift @@ -43,6 +43,9 @@ open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate { } } + /// Wraps around ImageView so RTL transformation on it doesn't interfere with UIScrollView zooming + private let imageViewWrapper = UIView() + // MARK: - Life cycle /** @@ -58,8 +61,14 @@ open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate { super.init(frame: CGRect.null) - imageView.clipsToBounds = true - imageView.isUserInteractionEnabled = true + imageViewWrapper.addSubview(imageView) + imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + + imageViewWrapper.clipsToBounds = true + imageViewWrapper.isUserInteractionEnabled = true + if UIApplication.shared.userInterfaceLayoutDirection == .rightToLeft { + imageView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi)) + } setPictoCenter() @@ -67,7 +76,7 @@ open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate { delegate = self showsVerticalScrollIndicator = false showsHorizontalScrollIndicator = false - addSubview(imageView) + addSubview(imageViewWrapper) minimumZoomScale = 1.0 maximumZoomScale = calculateMaximumScale() @@ -78,13 +87,13 @@ open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate { // tap gesture recognizer let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(ImageSlideshowItem.tapZoom)) tapRecognizer.numberOfTapsRequired = 2 - imageView.addGestureRecognizer(tapRecognizer) + imageViewWrapper.addGestureRecognizer(tapRecognizer) gestureRecognizer = tapRecognizer singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(retryLoadImage)) singleTapGestureRecognizer!.numberOfTapsRequired = 1 singleTapGestureRecognizer!.isEnabled = false - imageView.addGestureRecognizer(singleTapGestureRecognizer!) + imageViewWrapper.addGestureRecognizer(singleTapGestureRecognizer!) } required public init?(coder aDecoder: NSCoder) { @@ -95,9 +104,9 @@ open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate { super.layoutSubviews() if !zoomEnabled { - imageView.frame.size = frame.size + imageViewWrapper.frame.size = frame.size } else if !isZoomed() { - imageView.frame.size = calculatePictureSize() + imageViewWrapper.frame.size = calculatePictureSize() } if isFullScreen() { @@ -106,7 +115,7 @@ open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate { setPictoCenter() } - self.activityIndicator?.view.center = imageView.center + self.activityIndicator?.view.center = imageViewWrapper.center // if self.frame was changed and zoomInInitially enabled, zoom in if lastFrame != frame && zoomInInitially { @@ -115,7 +124,7 @@ open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate { lastFrame = self.frame - contentSize = imageView.frame.size + contentSize = imageViewWrapper.frame.size maximumZoomScale = calculateMaximumScale() } @@ -198,15 +207,15 @@ open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate { } fileprivate func setPictoCenter() { - var intendHorizon = (screenSize().width - imageView.frame.width ) / 2 - var intendVertical = (screenSize().height - imageView.frame.height ) / 2 + var intendHorizon = (screenSize().width - imageViewWrapper.frame.width ) / 2 + var intendVertical = (screenSize().height - imageViewWrapper.frame.height ) / 2 intendHorizon = intendHorizon > 0 ? intendHorizon : 0 intendVertical = intendVertical > 0 ? intendVertical : 0 contentInset = UIEdgeInsets(top: intendVertical, left: intendHorizon, bottom: intendVertical, right: intendHorizon) } private func isFullScreen() -> Bool { - return imageView.frame.width >= screenSize().width && imageView.frame.height >= screenSize().height + return imageViewWrapper.frame.width >= screenSize().width && imageViewWrapper.frame.height >= screenSize().height } func clearContentInsets() { @@ -220,7 +229,7 @@ open class ImageSlideshowItem: UIScrollView, UIScrollViewDelegate { } open func viewForZooming(in scrollView: UIScrollView) -> UIView? { - return zoomEnabled ? imageView : nil + return zoomEnabled ? imageViewWrapper : nil } }