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/FolioReaderAudioPlayer.swift b/Source/FolioReaderAudioPlayer.swift index 93f1b3915..bb10702bb 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() @@ -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) @@ -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..1f8a0676f 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? @@ -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,9 +168,31 @@ class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UICollectio currentPageNumber = 1 } + // MARK: Change page progressive direction + + func setCollectionViewProgressiveDirection() { + if FolioReader.needsRTLChange { + collectionView.transform = CGAffineTransformMakeScale(-1, 1) + } else { + collectionView.transform = CGAffineTransformIdentity + } + } + + func setPageProgressiveDirection(page: FolioReaderPage) { + if FolioReader.needsRTLChange { +// if page.transform.a == -1 { return } + page.transform = CGAffineTransformMakeScale(-1, 1) + } else { + page.transform = CGAffineTransformIdentity + } + } + + // 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() @@ -181,6 +204,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. @@ -265,6 +293,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) @@ -282,7 +312,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" @@ -300,15 +330,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" @@ -343,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() @@ -375,13 +405,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 FolioReader.isReaderReady else { return } + guard let currentPage = currentPage else { return } // Update pages pagesForCurrentPage(currentPage) @@ -390,7 +422,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,11 +431,11 @@ 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) { - if !FolioReader.sharedInstance.isReaderReady { return } + guard FolioReader.isReaderReady else { return } if currentPageNumber+1 >= totalPages { UIView.animateWithDuration(duration, animations: { @@ -481,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(currentPage.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 { @@ -543,10 +574,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 +600,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 +608,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 +733,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()") { @@ -970,15 +1003,20 @@ 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 } // 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 +1046,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/FolioReaderContainer.swift b/Source/FolioReaderContainer.swift index d81467ba3..a015e3331 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 } @@ -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/FolioReaderFontsMenu.swift b/Source/FolioReaderFontsMenu.swift index b3f69107b..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,18 +174,18 @@ 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) } // 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 { - FolioReader.sharedInstance.nightMode = Bool(index) + FolioReader.nightMode = Bool(index) let readerCenter = FolioReader.sharedInstance.readerCenter @@ -233,22 +233,22 @@ 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 } } // 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 { @@ -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..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,48 +67,67 @@ public class FolioReader : NSObject { } } - var nightMode: Bool { + /// 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) { FolioReader.defaults.setBool(value, forKey: kNightMode) } } - var currentFontName: Int { + + /// Check current font name + static var currentFontName: Int { get { return FolioReader.defaults.valueForKey(kCurrentFontFamily) as! Int } set (value) { FolioReader.defaults.setValue(value, forKey: kCurrentFontFamily) } } - var currentFontSize: Int { + /// Check current font size + static var currentFontSize: Int { get { return FolioReader.defaults.valueForKey(kCurrentFontSize) as! Int } set (value) { FolioReader.defaults.setValue(value, forKey: kCurrentFontSize) } } - var currentAudioRate: Int { + /// Check current audio rate, the speed of speech voice + static var currentAudioRate: Int { get { return FolioReader.defaults.valueForKey(kCurrentAudioRate) as! Int } set (value) { FolioReader.defaults.setValue(value, forKey: kCurrentAudioRate) } } - var currentHighlightStyle: Int { + /// Check the current highlight style + static var currentHighlightStyle: Int { get { return FolioReader.defaults.valueForKey(kCurrentHighlightStyle) as! Int } set (value) { FolioReader.defaults.setValue(value, forKey: kCurrentHighlightStyle) } } - var currentMediaOverlayStyle: MediaOverlayStyle { + /// Check the current Media Overlay or TTS style + 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 { + /// Check the current scroll direction + static var currentScrollDirection: Int { get { return FolioReader.defaults.valueForKey(kCurrentScrollDirection) as! Int } set (value) { FolioReader.defaults.setValue(value, forKey: kCurrentScrollDirection) @@ -122,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) } @@ -158,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) } @@ -183,7 +202,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 8f06d7dfd..191c2bb35 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 { @@ -143,17 +143,10 @@ class FolioReaderPage: UICollectionViewCell, UIWebViewDelegate, UIGestureRecogni } } - if scrollDirection == .negative() && 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) - }) - } + let direction: ScrollDirection = FolioReader.needsRTLChange ? .positive() : .negative() + + if scrollDirection == direction && isScrolling { + scrollPageToBottom() } UIView.animateWithDuration(0.2, animations: {webView.alpha = 1}) { finished in @@ -305,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 @@ -353,7 +362,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)')") } @@ -369,7 +378,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) @@ -471,7 +480,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 { @@ -543,7 +552,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) @@ -607,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 } } } 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())\")") } } 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() } }