From 7daff775a30b20747445b6f3d548bf35e037c893 Mon Sep 17 00:00:00 2001 From: Heberti Almeida Date: Fri, 29 Jul 2016 00:06:58 -0300 Subject: [PATCH 1/6] Light and safe refactor for currentPage --- Source/FolioReaderAudioPlayer.swift | 7 ++++--- Source/FolioReaderCenter.swift | 28 +++++++++++++++++----------- Source/FolioReaderFontsMenu.swift | 4 ++-- Source/FolioReaderPage.swift | 2 +- Source/Models/Highlight+Helper.swift | 2 +- Source/ScrollScrubber.swift | 6 +++--- 6 files changed, 28 insertions(+), 21 deletions(-) diff --git a/Source/FolioReaderAudioPlayer.swift b/Source/FolioReaderAudioPlayer.swift index 93f1b3915..e2a6a4210 100644 --- a/Source/FolioReaderAudioPlayer.swift +++ b/Source/FolioReaderAudioPlayer.swift @@ -152,7 +152,7 @@ class FolioReaderAudioPlayer: NSObject { func play() { if book.hasAudio() { - let currentPage = FolioReader.sharedInstance.readerCenter.currentPage + guard let currentPage = FolioReader.sharedInstance.readerCenter.currentPage else { return } currentPage.webView.js("playAudio()") } else { readCurrentSentence() @@ -378,8 +378,9 @@ class FolioReaderAudioPlayer: NSObject { } else { if synthesizer.speaking { stopSynthesizer(immediate: false, completion: { - let currentPage = FolioReader.sharedInstance.readerCenter.currentPage - currentPage.webView.js("resetCurrentSentenceIndex()") + if let currentPage = FolioReader.sharedInstance.readerCenter.currentPage { + currentPage.webView.js("resetCurrentSentenceIndex()") + } self.speakSentence() }) } else { diff --git a/Source/FolioReaderCenter.swift b/Source/FolioReaderCenter.swift index 95c8bad6c..5fab4baee 100755 --- a/Source/FolioReaderCenter.swift +++ b/Source/FolioReaderCenter.swift @@ -27,7 +27,7 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio var pages: [String]! var totalPages: Int! var tempFragment: String? - var currentPage: FolioReaderPage! + var currentPage: FolioReaderPage? var animator: ZFModalTransitionAnimator! var pageIndicatorView: FolioReaderPageIndicator! var bookShareLink: String? @@ -170,6 +170,8 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio // MARK: Change layout orientation func setScrollDirection(direction: FolioReaderScrollDirection) { + guard let currentPage = currentPage else { return } + // Get internal page offset before layout change let pageScrollView = currentPage.webView.scrollView pageOffsetRate = pageScrollView.contentOffset.forDirection() / pageScrollView.contentSize.forDirection() @@ -375,13 +377,15 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio self.collectionView.collectionViewLayout.invalidateLayout() // Adjust internal page offset - let pageScrollView = self.currentPage.webView.scrollView + guard let currentPage = self.currentPage else { return } + let pageScrollView = currentPage.webView.scrollView self.pageOffsetRate = pageScrollView.contentOffset.forDirection() / pageScrollView.contentSize.forDirection() }) } override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) { if !FolioReader.sharedInstance.isReaderReady { return } + guard let currentPage = currentPage else { return } // Update pages pagesForCurrentPage(currentPage) @@ -390,7 +394,7 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio scrollScrubber.setSliderVal() // After rotation fix internal page offset - var pageOffset = self.currentPage.webView.scrollView.contentSize.forDirection() * pageOffsetRate + var pageOffset = currentPage.webView.scrollView.contentSize.forDirection() * pageOffsetRate // Fix the offset for paged scroll if readerConfig.scrollDirection == .horizontal { @@ -399,7 +403,7 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio } let pageOffsetPoint = isVerticalDirection(CGPoint(x: 0, y: pageOffset), CGPoint(x: pageOffset, y: 0)) - self.currentPage.webView.scrollView.setContentOffset(pageOffsetPoint, animated: true) + currentPage.webView.scrollView.setContentOffset(pageOffsetPoint, animated: true) } override func willAnimateRotationToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { @@ -484,7 +488,7 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio if let page = page { let pageSize = isVerticalDirection(pageHeight, pageWidth) pageIndicatorView.totalPages = Int(ceil(page.webView.scrollView.contentSize.forDirection()/pageSize)) - let webViewPage = pageForOffset(currentPage.webView.scrollView.contentOffset.x, pageHeight: pageSize) + let webViewPage = pageForOffset(page.webView.scrollView.contentOffset.x, pageHeight: pageSize) pageIndicatorView.currentPage = webViewPage } } @@ -543,10 +547,10 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio func changePageWith(page page: Int, andFragment fragment: String, animated: Bool = false, completion: (() -> Void)? = nil) { if currentPageNumber == page { - if fragment != "" && currentPage != nil { + if let currentPage = currentPage where fragment != "" { currentPage.handleAnchor(fragment, avoidBeginningAnchors: true, animated: animated) - completion?() } + completion?() } else { tempFragment = fragment changePageWith(page: page, animated: animated, completion: { () -> Void in @@ -569,6 +573,7 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio func changePageWith(href href: String, andAudioMarkID markID: String) { if recentlyScrolled { return } // if user recently scrolled, do not change pages or scroll the webview + guard let currentPage = currentPage else { return } let item = findPageByHref(href) let pageUpdateNeeded = item+1 != currentPage.pageNumber @@ -576,10 +581,10 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio changePageWith(indexPath: indexPath, animated: true) { () -> Void in if pageUpdateNeeded { self.updateCurrentPage({ () -> Void in - self.currentPage.audioMarkID(markID) + currentPage.audioMarkID(markID) }) } else { - self.currentPage.audioMarkID(markID) + currentPage.audioMarkID(markID) } } } @@ -701,6 +706,7 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio Sharing chapter method. */ func shareChapter(sender: UIBarButtonItem) { + guard let currentPage = currentPage else { return } if let chapterText = currentPage.webView.js("getBodyText()") { @@ -978,7 +984,7 @@ extension FolioReaderCenter: FolioReaderPageDelegate { } // Go to fragment if needed - if let fragmentID = tempFragment where fragmentID != "" && currentPage != nil { + if let fragmentID = tempFragment, let currentPage = currentPage where fragmentID != "" { currentPage.handleAnchor(fragmentID, avoidBeginningAnchors: true, animated: true) tempFragment = nil } @@ -1008,7 +1014,7 @@ extension FolioReaderCenter: FolioReaderChapterListDelegate { // Move to #fragment if let reference = tempReference { - if let fragmentID = reference.fragmentID where fragmentID != "" && currentPage != nil { + if let fragmentID = reference.fragmentID, let currentPage = currentPage where fragmentID != "" { currentPage.handleAnchor(reference.fragmentID!, avoidBeginningAnchors: true, animated: true) } tempReference = nil diff --git a/Source/FolioReaderFontsMenu.swift b/Source/FolioReaderFontsMenu.swift index b3f69107b..b00e72b94 100644 --- a/Source/FolioReaderFontsMenu.swift +++ b/Source/FolioReaderFontsMenu.swift @@ -181,7 +181,7 @@ class FolioReaderFontsMenu: UIViewController, SMSegmentViewDelegate, UIGestureRe // MARK: - SMSegmentView delegate func segmentView(segmentView: SMSegmentView, didSelectSegmentAtIndex index: Int) { - let currentPage = FolioReader.sharedInstance.readerCenter.currentPage + guard let currentPage = FolioReader.sharedInstance.readerCenter.currentPage else { return } if segmentView.tag == 1 { @@ -248,7 +248,7 @@ class FolioReaderFontsMenu: UIViewController, SMSegmentViewDelegate, UIGestureRe // MARK: - Font slider changed func sliderValueChanged(sender: HADiscreteSlider) { - let currentPage = FolioReader.sharedInstance.readerCenter.currentPage + guard let currentPage = FolioReader.sharedInstance.readerCenter.currentPage else { return } let index = Int(sender.value) switch index { diff --git a/Source/FolioReaderPage.swift b/Source/FolioReaderPage.swift index 8f06d7dfd..59dcba937 100755 --- a/Source/FolioReaderPage.swift +++ b/Source/FolioReaderPage.swift @@ -353,7 +353,7 @@ class FolioReaderPage: UICollectionViewCell, UIWebViewDelegate, UIGestureRecogni - parameter ID: The ID */ func audioMarkID(ID: String) { - let currentPage = FolioReader.sharedInstance.readerCenter.currentPage + guard let currentPage = FolioReader.sharedInstance.readerCenter.currentPage else { return } currentPage.webView.js("audioMarkID('\(book.playbackActiveClass())','\(ID)')") } diff --git a/Source/Models/Highlight+Helper.swift b/Source/Models/Highlight+Helper.swift index d431aa93a..5c507d069 100644 --- a/Source/Models/Highlight+Helper.swift +++ b/Source/Models/Highlight+Helper.swift @@ -204,7 +204,7 @@ extension Highlight { } public static func removeFromHTMLById(highlightId: String) -> String? { - let currentPage = FolioReader.sharedInstance.readerCenter.currentPage + guard let currentPage = FolioReader.sharedInstance.readerCenter.currentPage else { return nil } if let removedId = currentPage.webView.js("removeHighlightById('\(highlightId)')") { return removedId diff --git a/Source/ScrollScrubber.swift b/Source/ScrollScrubber.swift index e54743cb4..2fa662d79 100644 --- a/Source/ScrollScrubber.swift +++ b/Source/ScrollScrubber.swift @@ -195,14 +195,14 @@ class ScrollScrubber: NSObject, UIScrollViewDelegate { // MARK: - utility methods private func scrollView() -> UIScrollView { - return delegate.currentPage.webView.scrollView + return delegate.currentPage!.webView.scrollView } private func height() -> CGFloat { - return delegate.currentPage.webView.scrollView.contentSize.height - pageHeight + 44 + return delegate.currentPage!.webView.scrollView.contentSize.height - pageHeight + 44 } private func scrollTop() -> CGFloat { - return delegate.currentPage.webView.scrollView.contentOffset.forDirection() + return delegate.currentPage!.webView.scrollView.contentOffset.forDirection() } } From 92dce65645aa8f2107c97e92cbb5691238fd673c Mon Sep 17 00:00:00 2001 From: Heberti Almeida Date: Fri, 29 Jul 2016 10:21:05 -0300 Subject: [PATCH 2/6] Initial implementation of RTL --- Source/EPUBCore/FREpubParser.swift | 8 +++++++- Source/EPUBCore/FRSpine.swift | 7 +++++++ Source/FolioReaderCenter.swift | 29 +++++++++++++++++++++++++++++ Source/FolioReaderPage.swift | 5 ++++- 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/Source/EPUBCore/FREpubParser.swift b/Source/EPUBCore/FREpubParser.swift index 74a606a95..364eb1dab 100755 --- a/Source/EPUBCore/FREpubParser.swift +++ b/Source/EPUBCore/FREpubParser.swift @@ -146,7 +146,13 @@ class FREpubParser: NSObject, SSZipArchiveDelegate { } // Read Spine - book.spine = readSpine(xmlDoc.root["spine"].children) + let spine = xmlDoc.root["spine"] + book.spine = readSpine(spine.children) + + // Page progress direction `ltr` or `rtl` + if let pageProgressionDirection = spine.attributes["page-progression-direction"] { + book.spine.pageProgressionDirection = pageProgressionDirection + } } catch { print("Cannot read .opf file.") } diff --git a/Source/EPUBCore/FRSpine.swift b/Source/EPUBCore/FRSpine.swift index 0f7f59cfa..94851d06e 100755 --- a/Source/EPUBCore/FRSpine.swift +++ b/Source/EPUBCore/FRSpine.swift @@ -19,7 +19,14 @@ struct Spine { } class FRSpine: NSObject { + var pageProgressionDirection: String? var spineReferences = [Spine]() + var isRtl: Bool { + if let pageProgressionDirection = pageProgressionDirection where pageProgressionDirection == "rtl" { + return true + } + return false + } func nextChapter(href: String) -> FRResource? { var found = false; diff --git a/Source/FolioReaderCenter.swift b/Source/FolioReaderCenter.swift index 5fab4baee..6b80fd2a0 100755 --- a/Source/FolioReaderCenter.swift +++ b/Source/FolioReaderCenter.swift @@ -156,6 +156,7 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio collectionView.reloadData() configureNavBarButtons() + setCollectionViewProgressiveDirection() if let position = FolioReader.defaults.valueForKey(kBookId) as? NSDictionary, let pageNumber = position["pageNumber"] as? Int where pageNumber > 0 { @@ -167,6 +168,27 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio currentPageNumber = 1 } + // MARK: Change page progressive direction + + func setCollectionViewProgressiveDirection() { + if book.spine.isRtl && readerConfig.scrollDirection == .horizontal { + collectionView.transform = CGAffineTransformMakeScale(-1, 1) + } else { + collectionView.transform = CGAffineTransformIdentity + } + } + + func setPageProgressiveDirection(page: FolioReaderPage) { + + if book.spine.isRtl && readerConfig.scrollDirection == .horizontal { +// if page.transform.a == -1 { return } + page.transform = CGAffineTransformMakeScale(-1, 1) + } else { + page.transform = CGAffineTransformIdentity + } + } + + // MARK: Change layout orientation func setScrollDirection(direction: FolioReaderScrollDirection) { @@ -183,6 +205,11 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio collectionView.collectionViewLayout.invalidateLayout() collectionView.setContentOffset(frameForPage(currentPageNumber).origin, animated: false) + // Page progressive direction + setCollectionViewProgressiveDirection() + delay(0.2) { self.setPageProgressiveDirection(currentPage) } + + /** * This delay is needed because the page will not be ready yet * so the delay wait until layout finished the changes. @@ -267,6 +294,8 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio cell.delegate = self cell.backgroundColor = UIColor.clearColor() + setPageProgressiveDirection(cell) + // Configure the cell let resource = book.spine.spineReferences[indexPath.row].resource var html = try? String(contentsOfFile: resource.fullHref, encoding: NSUTF8StringEncoding) diff --git a/Source/FolioReaderPage.swift b/Source/FolioReaderPage.swift index 59dcba937..180da7b61 100755 --- a/Source/FolioReaderPage.swift +++ b/Source/FolioReaderPage.swift @@ -143,7 +143,10 @@ class FolioReaderPage: UICollectionViewCell, UIWebViewDelegate, UIGestureRecogni } } - if scrollDirection == .negative() && isScrolling { +// if scrollDirection == .negative() && isScrolling { + let direction: ScrollDirection = book.spine.isRtl && readerConfig.scrollDirection == .horizontal ? .positive() : .negative() + + if scrollDirection == direction && isScrolling { let bottomOffset = isVerticalDirection( CGPointMake(0, webView.scrollView.contentSize.height - webView.scrollView.bounds.height), CGPointMake(webView.scrollView.contentSize.width - webView.scrollView.bounds.width, 0) From afe1ac9d6457525afda24366ef1c6d462f88e865 Mon Sep 17 00:00:00 2001 From: Heberti Almeida Date: Mon, 1 Aug 2016 13:16:57 -0300 Subject: [PATCH 3/6] Fixed layout when change direction --- Source/FolioReaderPage.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/FolioReaderPage.swift b/Source/FolioReaderPage.swift index 180da7b61..018efca88 100755 --- a/Source/FolioReaderPage.swift +++ b/Source/FolioReaderPage.swift @@ -73,8 +73,8 @@ class FolioReaderPage: UICollectionViewCell, UIWebViewDelegate, UIGestureRecogni override func layoutSubviews() { super.layoutSubviews() - webView.frame = webViewFrame() webView.setupScrollDirection() + webView.frame = webViewFrame() } func webViewFrame() -> CGRect { From a70b1806d7159343ae1389a7cc5fa4dfcd530a8a Mon Sep 17 00:00:00 2001 From: Heberti Almeida Date: Mon, 1 Aug 2016 15:35:54 -0300 Subject: [PATCH 4/6] Static var for static properties --- Source/FolioReaderAudioPlayer.swift | 4 ++-- Source/FolioReaderCenter.swift | 8 ++++---- Source/FolioReaderContainer.swift | 2 +- Source/FolioReaderFontsMenu.swift | 18 +++++++++--------- Source/FolioReaderHighlightList.swift | 4 ++-- Source/FolioReaderKit.swift | 17 +++++++++-------- Source/FolioReaderPage.swift | 9 ++++----- Source/FolioReaderPageIndicator.swift | 2 +- Source/FolioReaderPlayerMenu.swift | 14 +++++++------- 9 files changed, 39 insertions(+), 39 deletions(-) diff --git a/Source/FolioReaderAudioPlayer.swift b/Source/FolioReaderAudioPlayer.swift index e2a6a4210..bb10702bb 100644 --- a/Source/FolioReaderAudioPlayer.swift +++ b/Source/FolioReaderAudioPlayer.swift @@ -266,7 +266,7 @@ class FolioReaderAudioPlayer: NSObject { guard let player = player else { return false } - setRate(FolioReader.sharedInstance.currentAudioRate) + setRate(FolioReader.currentAudioRate) player.enableRate = true player.prepareToPlay() player.delegate = self @@ -335,7 +335,7 @@ class FolioReaderAudioPlayer: NSObject { if synthesizer == nil { synthesizer = AVSpeechSynthesizer() synthesizer.delegate = self - setRate(FolioReader.sharedInstance.currentAudioRate) + setRate(FolioReader.currentAudioRate) } let utterance = AVSpeechUtterance(string: text) diff --git a/Source/FolioReaderCenter.swift b/Source/FolioReaderCenter.swift index 6b80fd2a0..917334943 100755 --- a/Source/FolioReaderCenter.swift +++ b/Source/FolioReaderCenter.swift @@ -313,7 +313,7 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio // Font class name var classes = "" - let currentFontName = FolioReader.sharedInstance.currentFontName + let currentFontName = FolioReader.currentFontName switch currentFontName { case 0: classes = "andada" @@ -331,15 +331,15 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio break } - classes += " "+FolioReader.sharedInstance.currentMediaOverlayStyle.className() + classes += " "+FolioReader.currentMediaOverlayStyle.className() // Night mode - if FolioReader.sharedInstance.nightMode { + if FolioReader.nightMode { classes += " nightMode" } // Font Size - let currentFontSize = FolioReader.sharedInstance.currentFontSize + let currentFontSize = FolioReader.currentFontSize switch currentFontSize { case 0: classes += " textSizeOne" diff --git a/Source/FolioReaderContainer.swift b/Source/FolioReaderContainer.swift index d81467ba3..f708934bf 100755 --- a/Source/FolioReaderContainer.swift +++ b/Source/FolioReaderContainer.swift @@ -59,7 +59,7 @@ class FolioReaderContainer: UIViewController { // If user can change scroll direction use the last saved if readerConfig.canChangeScrollDirection { - let direction = FolioReaderScrollDirection(rawValue: FolioReader.sharedInstance.currentScrollDirection) ?? .vertical + let direction = FolioReaderScrollDirection(rawValue: FolioReader.currentScrollDirection) ?? .vertical readerConfig.scrollDirection = direction } diff --git a/Source/FolioReaderFontsMenu.swift b/Source/FolioReaderFontsMenu.swift index b00e72b94..b0951c8b0 100644 --- a/Source/FolioReaderFontsMenu.swift +++ b/Source/FolioReaderFontsMenu.swift @@ -69,7 +69,7 @@ class FolioReaderFontsMenu: UIViewController, SMSegmentViewDelegate, UIGestureRe dayNight.tag = 1 dayNight.addSegmentWithTitle(readerConfig.localizedFontMenuDay, onSelectionImage: sunSelected, offSelectionImage: sunNormal) dayNight.addSegmentWithTitle(readerConfig.localizedFontMenuNight, onSelectionImage: moonSelected, offSelectionImage: moonNormal) - dayNight.selectSegmentAtIndex(Int(FolioReader.sharedInstance.nightMode)) + dayNight.selectSegmentAtIndex(Int(FolioReader.nightMode)) menuView.addSubview(dayNight) @@ -99,7 +99,7 @@ class FolioReaderFontsMenu: UIViewController, SMSegmentViewDelegate, UIGestureRe fontName.segments[1].titleFont = UIFont(name: "Lato-Regular", size: 18)! fontName.segments[2].titleFont = UIFont(name: "Lora-Regular", size: 18)! fontName.segments[3].titleFont = UIFont(name: "Raleway-Regular", size: 18)! - fontName.selectSegmentAtIndex(FolioReader.sharedInstance.currentFontName) + fontName.selectSegmentAtIndex(FolioReader.currentFontName) menuView.addSubview(fontName) // Separator 2 @@ -122,7 +122,7 @@ class FolioReaderFontsMenu: UIViewController, SMSegmentViewDelegate, UIGestureRe slider.backgroundColor = UIColor.clearColor() slider.tintColor = readerConfig.nightModeSeparatorColor slider.minimumValue = 0 - slider.value = CGFloat(FolioReader.sharedInstance.currentFontSize) + slider.value = CGFloat(FolioReader.currentFontSize) slider.addTarget(self, action: #selector(FolioReaderFontsMenu.sliderValueChanged(_:)), forControlEvents: UIControlEvents.ValueChanged) // Force remove fill color @@ -174,7 +174,7 @@ class FolioReaderFontsMenu: UIViewController, SMSegmentViewDelegate, UIGestureRe layoutDirection.tag = 3 layoutDirection.addSegmentWithTitle(readerConfig.localizedLayoutVertical, onSelectionImage: verticalSelected, offSelectionImage: verticalNormal) layoutDirection.addSegmentWithTitle(readerConfig.localizedLayoutHorizontal, onSelectionImage: horizontalSelected, offSelectionImage: horizontalNormal) - layoutDirection.selectSegmentAtIndex(Int(FolioReader.sharedInstance.currentScrollDirection)) + layoutDirection.selectSegmentAtIndex(Int(FolioReader.currentScrollDirection)) menuView.addSubview(layoutDirection) } @@ -185,7 +185,7 @@ class FolioReaderFontsMenu: UIViewController, SMSegmentViewDelegate, UIGestureRe if segmentView.tag == 1 { - FolioReader.sharedInstance.nightMode = Bool(index) + FolioReader.nightMode = Bool(index) let readerCenter = FolioReader.sharedInstance.readerCenter @@ -233,15 +233,15 @@ class FolioReaderFontsMenu: UIViewController, SMSegmentViewDelegate, UIGestureRe break } - FolioReader.sharedInstance.currentFontName = index + FolioReader.currentFontName = index } if segmentView.tag == 3 { - guard FolioReader.sharedInstance.currentScrollDirection != index else { return } + guard FolioReader.currentScrollDirection != index else { return } let direction = FolioReaderScrollDirection(rawValue: index) ?? .vertical FolioReader.sharedInstance.readerCenter.setScrollDirection(direction) - FolioReader.sharedInstance.currentScrollDirection = index + FolioReader.currentScrollDirection = index } } @@ -271,7 +271,7 @@ class FolioReaderFontsMenu: UIViewController, SMSegmentViewDelegate, UIGestureRe break } - FolioReader.sharedInstance.currentFontSize = index + FolioReader.currentFontSize = index } // MARK: - Gestures diff --git a/Source/FolioReaderHighlightList.swift b/Source/FolioReaderHighlightList.swift index 56505c3c7..fba9967d7 100644 --- a/Source/FolioReaderHighlightList.swift +++ b/Source/FolioReaderHighlightList.swift @@ -74,10 +74,10 @@ class FolioReaderHighlightList: UITableViewController { if highlight.type == HighlightStyle.Underline.rawValue { text.addAttribute(NSBackgroundColorAttributeName, value: UIColor.clearColor(), range: range) - text.addAttribute(NSUnderlineColorAttributeName, value: HighlightStyle.colorForStyle(highlight.type, nightMode: FolioReader.sharedInstance.nightMode), range: range) + text.addAttribute(NSUnderlineColorAttributeName, value: HighlightStyle.colorForStyle(highlight.type, nightMode: FolioReader.nightMode), range: range) text.addAttribute(NSUnderlineStyleAttributeName, value: NSNumber(integer: NSUnderlineStyle.StyleSingle.rawValue), range: range) } else { - text.addAttribute(NSBackgroundColorAttributeName, value: HighlightStyle.colorForStyle(highlight.type, nightMode: FolioReader.sharedInstance.nightMode), range: range) + text.addAttribute(NSBackgroundColorAttributeName, value: HighlightStyle.colorForStyle(highlight.type, nightMode: FolioReader.nightMode), range: range) } // Text diff --git a/Source/FolioReaderKit.swift b/Source/FolioReaderKit.swift index 9728d63ab..07b9326e3 100755 --- a/Source/FolioReaderKit.swift +++ b/Source/FolioReaderKit.swift @@ -69,48 +69,49 @@ public class FolioReader : NSObject { } } - var nightMode: Bool { + static var nightMode: Bool { get { return FolioReader.defaults.boolForKey(kNightMode) } set (value) { FolioReader.defaults.setBool(value, forKey: kNightMode) } } - var currentFontName: Int { + + static var currentFontName: Int { get { return FolioReader.defaults.valueForKey(kCurrentFontFamily) as! Int } set (value) { FolioReader.defaults.setValue(value, forKey: kCurrentFontFamily) } } - var currentFontSize: Int { + static var currentFontSize: Int { get { return FolioReader.defaults.valueForKey(kCurrentFontSize) as! Int } set (value) { FolioReader.defaults.setValue(value, forKey: kCurrentFontSize) } } - var currentAudioRate: Int { + static var currentAudioRate: Int { get { return FolioReader.defaults.valueForKey(kCurrentAudioRate) as! Int } set (value) { FolioReader.defaults.setValue(value, forKey: kCurrentAudioRate) } } - var currentHighlightStyle: Int { + static var currentHighlightStyle: Int { get { return FolioReader.defaults.valueForKey(kCurrentHighlightStyle) as! Int } set (value) { FolioReader.defaults.setValue(value, forKey: kCurrentHighlightStyle) } } - var currentMediaOverlayStyle: MediaOverlayStyle { + static var currentMediaOverlayStyle: MediaOverlayStyle { get { return MediaOverlayStyle(rawValue: FolioReader.defaults.valueForKey(kCurrentMediaOverlayStyle) as! Int)! } set (value) { FolioReader.defaults.setValue(value.rawValue, forKey: kCurrentMediaOverlayStyle) } } - var currentScrollDirection: Int { + static var currentScrollDirection: Int { get { return FolioReader.defaults.valueForKey(kCurrentScrollDirection) as! Int } set (value) { FolioReader.defaults.setValue(value, forKey: kCurrentScrollDirection) @@ -183,7 +184,7 @@ public class FolioReader : NSObject { // MARK: - Global Functions func isNight (f: T, _ l: T) -> T { - return FolioReader.sharedInstance.nightMode ? f : l + return FolioReader.nightMode ? f : l } // MARK: - Scroll Direction Functions diff --git a/Source/FolioReaderPage.swift b/Source/FolioReaderPage.swift index 018efca88..59e139e87 100755 --- a/Source/FolioReaderPage.swift +++ b/Source/FolioReaderPage.swift @@ -143,8 +143,7 @@ class FolioReaderPage: UICollectionViewCell, UIWebViewDelegate, UIGestureRecogni } } -// if scrollDirection == .negative() && isScrolling { - let direction: ScrollDirection = book.spine.isRtl && readerConfig.scrollDirection == .horizontal ? .positive() : .negative() + let direction: ScrollDirection = FolioReader.needsRTLChange ? .positive() : .negative() if scrollDirection == direction && isScrolling { let bottomOffset = isVerticalDirection( @@ -372,7 +371,7 @@ class FolioReaderPage: UICollectionViewCell, UIWebViewDelegate, UIGestureRecogni // MARK: ColorView fix for horizontal layout func refreshPageMode() { - if FolioReader.sharedInstance.nightMode { + if FolioReader.nightMode { // omit create webView and colorView let script = "document.documentElement.offsetHeight" let contentHeight = webView.stringByEvaluatingJavaScriptFromString(script) @@ -474,7 +473,7 @@ extension UIWebView { } func highlight(sender: UIMenuController?) { - let highlightAndReturn = js("highlightString('\(HighlightStyle.classForStyle(FolioReader.sharedInstance.currentHighlightStyle))')") + let highlightAndReturn = js("highlightString('\(HighlightStyle.classForStyle(FolioReader.currentHighlightStyle))')") let jsonData = highlightAndReturn?.dataUsingEncoding(NSUTF8StringEncoding) do { @@ -546,7 +545,7 @@ extension UIWebView { } func changeHighlightStyle(sender: UIMenuController?, style: HighlightStyle) { - FolioReader.sharedInstance.currentHighlightStyle = style.rawValue + FolioReader.currentHighlightStyle = style.rawValue if let updateId = js("setHighlightStyle('\(HighlightStyle.classForStyle(style.rawValue))')") { Highlight.updateById(updateId, type: style) diff --git a/Source/FolioReaderPageIndicator.swift b/Source/FolioReaderPageIndicator.swift index 39552f269..28cab892c 100644 --- a/Source/FolioReaderPageIndicator.swift +++ b/Source/FolioReaderPageIndicator.swift @@ -68,7 +68,7 @@ class FolioReaderPageIndicator: UIView { } private func reloadViewWithPage(page: Int) { - let pagesRemaining = totalPages-page + let pagesRemaining = FolioReader.needsRTLChange ? totalPages-(totalPages-page+1) : totalPages-page if pagesRemaining == 1 { pagesLabel.text = " "+readerConfig.localizedReaderOnePageLeft diff --git a/Source/FolioReaderPlayerMenu.swift b/Source/FolioReaderPlayerMenu.swift index b34bc835a..3826c82d2 100644 --- a/Source/FolioReaderPlayerMenu.swift +++ b/Source/FolioReaderPlayerMenu.swift @@ -117,7 +117,7 @@ class FolioReaderPlayerMenu: UIViewController, SMSegmentViewDelegate, UIGestureR playbackRate.addSegmentWithTitle("1½x", onSelectionImage: nil, offSelectionImage: nil) playbackRate.addSegmentWithTitle("2x", onSelectionImage: nil, offSelectionImage: nil) playbackRate.segmentTitleFont = UIFont(name: "Avenir-Light", size: 17)! - playbackRate.selectSegmentAtIndex(Int(FolioReader.sharedInstance.currentAudioRate)) + playbackRate.selectSegmentAtIndex(Int(FolioReader.currentAudioRate)) menuView.addSubview(playbackRate) @@ -178,9 +178,9 @@ class FolioReaderPlayerMenu: UIViewController, SMSegmentViewDelegate, UIGestureR menuView.addSubview(style2line) // select the current style - style0.selected = (FolioReader.sharedInstance.currentMediaOverlayStyle == .Default) - style1.selected = (FolioReader.sharedInstance.currentMediaOverlayStyle == .Underline) - style2.selected = (FolioReader.sharedInstance.currentMediaOverlayStyle == .TextColor) + style0.selected = (FolioReader.currentMediaOverlayStyle == .Default) + style1.selected = (FolioReader.currentMediaOverlayStyle == .Underline) + style2.selected = (FolioReader.currentMediaOverlayStyle == .TextColor) if style0.selected { style0Bgd.backgroundColor = selectedColor } // hook up button actions @@ -229,7 +229,7 @@ class FolioReaderPlayerMenu: UIViewController, SMSegmentViewDelegate, UIGestureR audioPlayer.setRate(index) - FolioReader.sharedInstance.currentAudioRate = index + FolioReader.currentAudioRate = index } } @@ -248,7 +248,7 @@ class FolioReaderPlayerMenu: UIViewController, SMSegmentViewDelegate, UIGestureR } func changeStyle(sender: UIButton!) { - FolioReader.sharedInstance.currentMediaOverlayStyle = MediaOverlayStyle(rawValue: sender.tag)! + FolioReader.currentMediaOverlayStyle = MediaOverlayStyle(rawValue: sender.tag)! // select the proper style button for btn in styleOptionBtns { @@ -261,7 +261,7 @@ class FolioReaderPlayerMenu: UIViewController, SMSegmentViewDelegate, UIGestureR // update the current page style if let currentPage = FolioReader.sharedInstance.readerCenter.currentPage { - currentPage.webView.js("setMediaOverlayStyle(\"\(FolioReader.sharedInstance.currentMediaOverlayStyle.className())\")") + currentPage.webView.js("setMediaOverlayStyle(\"\(FolioReader.currentMediaOverlayStyle.className())\")") } } From d43118ed8ef23a61e1dce46ea3dc03c99c57f5f6 Mon Sep 17 00:00:00 2001 From: Heberti Almeida Date: Mon, 1 Aug 2016 16:12:52 -0300 Subject: [PATCH 5/6] Refactor reader states --- Source/FolioReaderCenter.swift | 22 ++++++------- Source/FolioReaderContainer.swift | 4 +-- Source/FolioReaderKit.swift | 54 ++++++++++++++++++++----------- 3 files changed, 48 insertions(+), 32 deletions(-) diff --git a/Source/FolioReaderCenter.swift b/Source/FolioReaderCenter.swift index 917334943..6e1caf1e8 100755 --- a/Source/FolioReaderCenter.swift +++ b/Source/FolioReaderCenter.swift @@ -171,7 +171,7 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio // MARK: Change page progressive direction func setCollectionViewProgressiveDirection() { - if book.spine.isRtl && readerConfig.scrollDirection == .horizontal { + if FolioReader.needsRTLChange { collectionView.transform = CGAffineTransformMakeScale(-1, 1) } else { collectionView.transform = CGAffineTransformIdentity @@ -179,8 +179,7 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio } func setPageProgressiveDirection(page: FolioReaderPage) { - - if book.spine.isRtl && readerConfig.scrollDirection == .horizontal { + if FolioReader.needsRTLChange { // if page.transform.a == -1 { return } page.transform = CGAffineTransformMakeScale(-1, 1) } else { @@ -374,7 +373,7 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio // MARK: - Device rotation override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { - if !FolioReader.sharedInstance.isReaderReady { return } + guard FolioReader.isReaderReady else { return } setPageSize(toInterfaceOrientation) updateCurrentPage() @@ -413,7 +412,7 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio } override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) { - if !FolioReader.sharedInstance.isReaderReady { return } + guard FolioReader.isReaderReady else { return } guard let currentPage = currentPage else { return } // Update pages @@ -436,7 +435,7 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio } override func willAnimateRotationToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { - if !FolioReader.sharedInstance.isReaderReady { return } + guard FolioReader.isReaderReady else { return } if currentPageNumber+1 >= totalPages { UIView.animateWithDuration(duration, animations: { @@ -514,12 +513,11 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio } func pagesForCurrentPage(page: FolioReaderPage?) { - if let page = page { - let pageSize = isVerticalDirection(pageHeight, pageWidth) - pageIndicatorView.totalPages = Int(ceil(page.webView.scrollView.contentSize.forDirection()/pageSize)) - let webViewPage = pageForOffset(page.webView.scrollView.contentOffset.x, pageHeight: pageSize) - pageIndicatorView.currentPage = webViewPage - } + guard let page = page else { return } + let pageSize = isVerticalDirection(pageHeight, pageWidth) + pageIndicatorView.totalPages = Int(ceil(page.webView.scrollView.contentSize.forDirection()/pageSize)) + let webViewPage = pageForOffset(page.webView.scrollView.contentOffset.x, pageHeight: pageSize) + pageIndicatorView.currentPage = webViewPage } func pageForOffset(offset: CGFloat, pageHeight height: CGFloat) -> Int { diff --git a/Source/FolioReaderContainer.swift b/Source/FolioReaderContainer.swift index f708934bf..a015e3331 100755 --- a/Source/FolioReaderContainer.swift +++ b/Source/FolioReaderContainer.swift @@ -92,7 +92,7 @@ class FolioReaderContainer: UIViewController { self.errorOnLoad = true } - FolioReader.sharedInstance.isReaderOpen = true + FolioReader.isReaderOpen = true if !self.errorOnLoad { // Reload data @@ -105,7 +105,7 @@ class FolioReaderContainer: UIViewController { self.centerViewController.reloadData() - FolioReader.sharedInstance.isReaderReady = true + FolioReader.isReaderReady = true }) } }) diff --git a/Source/FolioReaderKit.swift b/Source/FolioReaderKit.swift index 07b9326e3..5db5cd0ac 100755 --- a/Source/FolioReaderKit.swift +++ b/Source/FolioReaderKit.swift @@ -41,7 +41,7 @@ enum MediaOverlayStyle: Int { case Underline case TextColor - init () { + init() { self = .Default } @@ -51,16 +51,14 @@ enum MediaOverlayStyle: Int { } /** -* Main Library class with some useful constants and methods -*/ + * Main Library class with some useful constants and methods + */ public class FolioReader : NSObject { static let sharedInstance = FolioReader() static let defaults = NSUserDefaults.standardUserDefaults() weak var readerCenter: FolioReaderCenter! weak var readerContainer: FolioReaderContainer! weak var readerAudioPlayer: FolioReaderAudioPlayer! - var isReaderOpen = false - var isReaderReady = false private override init() { let isMigrated = FolioReader.defaults.boolForKey(kMigratedToRealm) @@ -69,6 +67,18 @@ public class FolioReader : NSObject { } } + /// Check if reader is open + static var isReaderOpen = false + + /// Check if reader is open and ready + static var isReaderReady = false + + /// Check if layout needs to change to fit Right To Left + static var needsRTLChange: Bool { + return book.spine.isRtl && readerConfig.scrollDirection == .horizontal + } + + /// Check if current theme is Night mode static var nightMode: Bool { get { return FolioReader.defaults.boolForKey(kNightMode) } set (value) { @@ -76,6 +86,7 @@ public class FolioReader : NSObject { } } + /// Check current font name static var currentFontName: Int { get { return FolioReader.defaults.valueForKey(kCurrentFontFamily) as! Int } set (value) { @@ -83,6 +94,7 @@ public class FolioReader : NSObject { } } + /// Check current font size static var currentFontSize: Int { get { return FolioReader.defaults.valueForKey(kCurrentFontSize) as! Int } set (value) { @@ -90,6 +102,7 @@ public class FolioReader : NSObject { } } + /// Check current audio rate, the speed of speech voice static var currentAudioRate: Int { get { return FolioReader.defaults.valueForKey(kCurrentAudioRate) as! Int } set (value) { @@ -97,6 +110,7 @@ public class FolioReader : NSObject { } } + /// Check the current highlight style static var currentHighlightStyle: Int { get { return FolioReader.defaults.valueForKey(kCurrentHighlightStyle) as! Int } set (value) { @@ -104,6 +118,7 @@ public class FolioReader : NSObject { } } + /// Check the current Media Overlay or TTS style static var currentMediaOverlayStyle: MediaOverlayStyle { get { return MediaOverlayStyle(rawValue: FolioReader.defaults.valueForKey(kCurrentMediaOverlayStyle) as! Int)! } set (value) { @@ -111,6 +126,7 @@ public class FolioReader : NSObject { } } + /// Check the current scroll direction static var currentScrollDirection: Int { get { return FolioReader.defaults.valueForKey(kCurrentScrollDirection) as! Int } set (value) { @@ -123,7 +139,6 @@ public class FolioReader : NSObject { /** Read Cover Image and Return an IUImage */ - public class func getCoverImage(epubPath: String) -> UIImage? { return FREpubParser().parseCoverImage(epubPath) } @@ -159,23 +174,26 @@ public class FolioReader : NSObject { Save Reader state, book, page and scroll are saved */ class func saveReaderState() { - if FolioReader.sharedInstance.isReaderOpen { - if let currentPage = FolioReader.sharedInstance.readerCenter.currentPage { - let position = [ - "pageNumber": currentPageNumber, - "pageOffsetX": currentPage.webView.scrollView.contentOffset.x, - "pageOffsetY": currentPage.webView.scrollView.contentOffset.y - ] - - FolioReader.defaults.setObject(position, forKey: kBookId) - } + guard FolioReader.isReaderOpen else { return } + + if let currentPage = FolioReader.sharedInstance.readerCenter.currentPage { + let position = [ + "pageNumber": currentPageNumber, + "pageOffsetX": currentPage.webView.scrollView.contentOffset.x, + "pageOffsetY": currentPage.webView.scrollView.contentOffset.y + ] + + FolioReader.defaults.setObject(position, forKey: kBookId) } } + /** + Closes and save the reader current instance + */ class func close() { FolioReader.saveReaderState() - FolioReader.sharedInstance.isReaderOpen = false - FolioReader.sharedInstance.isReaderReady = false + FolioReader.isReaderOpen = false + FolioReader.isReaderReady = false FolioReader.sharedInstance.readerAudioPlayer.stop(immediate: true) FolioReader.defaults.setInteger(0, forKey: kCurrentTOCMenu) } From 715c97d95b6979fa565a4fb3a46a912c94931775 Mon Sep 17 00:00:00 2001 From: Heberti Almeida Date: Tue, 2 Aug 2016 23:51:21 -0300 Subject: [PATCH 6/6] Finished RTL support --- Source/FolioReaderCenter.swift | 7 +++++- Source/FolioReaderPage.swift | 41 ++++++++++++++++++++-------------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/Source/FolioReaderCenter.swift b/Source/FolioReaderCenter.swift index 6e1caf1e8..1f8a0676f 100755 --- a/Source/FolioReaderCenter.swift +++ b/Source/FolioReaderCenter.swift @@ -1003,8 +1003,13 @@ extension FolioReaderCenter: FolioReaderPageDelegate { if currentPageNumber == pageNumber && pageOffset > 0 { page.scrollPageToOffset(pageOffset, animated: false) } + } else { + updateCurrentPage(page) + + if !isScrolling && FolioReader.needsRTLChange { + page.scrollPageToBottom() + } } - } else if isFirstLoad { updateCurrentPage(page) isFirstLoad = false diff --git a/Source/FolioReaderPage.swift b/Source/FolioReaderPage.swift index 59e139e87..191c2bb35 100755 --- a/Source/FolioReaderPage.swift +++ b/Source/FolioReaderPage.swift @@ -146,16 +146,7 @@ class FolioReaderPage: UICollectionViewCell, UIWebViewDelegate, UIGestureRecogni let direction: ScrollDirection = FolioReader.needsRTLChange ? .positive() : .negative() if scrollDirection == direction && isScrolling { - let bottomOffset = isVerticalDirection( - CGPointMake(0, webView.scrollView.contentSize.height - webView.scrollView.bounds.height), - CGPointMake(webView.scrollView.contentSize.width - webView.scrollView.bounds.width, 0) - ) - - if bottomOffset.forDirection() >= 0 { - dispatch_async(dispatch_get_main_queue(), { - webView.scrollView.setContentOffset(bottomOffset, animated: false) - }) - } + scrollPageToBottom() } UIView.animateWithDuration(0.2, animations: {webView.alpha = 1}) { finished in @@ -307,6 +298,22 @@ class FolioReaderPage: UICollectionViewCell, UIWebViewDelegate, UIGestureRecogni webView.scrollView.setContentOffset(pageOffsetPoint, animated: animated) } + /** + Scrolls the page to bottom + */ + func scrollPageToBottom() { + let bottomOffset = isVerticalDirection( + CGPointMake(0, webView.scrollView.contentSize.height - webView.scrollView.bounds.height), + CGPointMake(webView.scrollView.contentSize.width - webView.scrollView.bounds.width, 0) + ) + + if bottomOffset.forDirection() >= 0 { + dispatch_async(dispatch_get_main_queue(), { + self.webView.scrollView.setContentOffset(bottomOffset, animated: false) + }) + } + } + /** Handdle #anchors in html, get the offset and scroll to it @@ -609,14 +616,14 @@ extension UIWebView { func setupScrollDirection() { if readerConfig.scrollDirection == .horizontal { - self.scrollView.pagingEnabled = true - self.paginationMode = .LeftToRight - self.paginationBreakingMode = .Page - self.scrollView.bounces = false + scrollView.pagingEnabled = true + paginationMode = .LeftToRight + paginationBreakingMode = .Page + scrollView.bounces = false } else { - self.scrollView.pagingEnabled = false - self.paginationMode = .Unpaginated - self.scrollView.bounces = true + scrollView.pagingEnabled = false + paginationMode = .Unpaginated + scrollView.bounces = true } } }