123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- //
- // KMAotuFlowExtension.swift
- // PDF Reader Pro
- //
- // Created by lizhe on 2024/1/16.
- //
- import Cocoa
- private var autoFlowTimerKey: UInt8 = 0
- private var fastFlowTimerKey: UInt8 = 0
- extension CPDFView {
- var autoFlowTimer: Timer? {
- get {
- return objc_getAssociatedObject(self, &autoFlowTimerKey) as? Timer
- }
- set {
- objc_setAssociatedObject(self, &autoFlowTimerKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
- var fastFlowTimer: Timer? {
- get {
- return objc_getAssociatedObject(self, &fastFlowTimerKey) as? Timer
- }
- set {
- objc_setAssociatedObject(self, &fastFlowTimerKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
- func startAutoFlow() {
- let timeInterval = SettingsManager.sharedInstance.autoScrollTimeInterval
- let timer = Timer.scheduledTimer(timeInterval: TimeInterval(timeInterval), target: self, selector: #selector(updateAutoFlow), userInfo: nil, repeats: true)
- autoFlowTimer = timer
- let _ = CustomAlertView.alertView(message: NSLocalizedString("AutoScroll On", comment: ""), fromView: self, withStyle: .black)
- }
- @objc func updateAutoFlow() {
-
- let jumpSpace = SettingsManager.sharedInstance.autoScrollJumpSpace
- if self.displayMode() == .singlePage ||
- self.displayMode() == .twoUp {
- if canGoToNextPage() {
- goToNextPage(nil)
- } else {
- stopAutoFlow()
- }
- } else {
- if let scrollView = documentView() {
- let clipView = scrollView.contentView
- var newOrigin = clipView.bounds.origin
- newOrigin.y = newOrigin.y + CGFloat(jumpSpace)
- clipView.animator().setBoundsOrigin(newOrigin)
- if newOrigin.y <= 0 {
- stopAutoFlow()
- }
- }
- }
- }
-
- func stopAutoFlow() {
- autoFlowTimer?.invalidate()
- autoFlowTimer = nil
-
- let _ = CustomAlertView.alertView(message: NSLocalizedString("AutoScroll Off", comment: ""), fromView: self, withStyle: .black)
- }
-
- func isAutoFlow() -> Bool {
- return autoFlowTimer != nil && autoFlowTimer!.isValid
- }
- func autoFlow() {
- if isAutoFlow() {
- stopAutoFlow()
- } else {
- startAutoFlow()
- }
- }
- func startFastFlow() {
- let timeInterval: TimeInterval = 0.1
- let timer = Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector: #selector(updateFastFlow), userInfo: nil, repeats: true)
- fastFlowTimer = timer
- }
- @objc func updateFastFlow() {
- let jumpSpace: CGFloat = 200
-
- updateScrollView(with: jumpSpace)
-
- }
- func updateScrollView(with jumpSpace: CGFloat) {
- if self.displayMode() == .singlePage || self.displayMode() == .twoUp {
- if canGoToNextPage() {
- goToNextPage(nil)
- } else {
- stopFastFlow()
- }
- } else {
- if let scrollView = documentView().enclosingScrollView {
- let clipView = scrollView.contentView
- var newOrigin = clipView.bounds.origin
- newOrigin.y -= jumpSpace
- clipView.animator().setBoundsOrigin(newOrigin)
- if newOrigin.y <= 0 /*&& isScrollUp*/ {
- stopFastFlow()
- } else if newOrigin.y >= documentView().frame.size.height /*&& !isScrollUp*/ {
- stopFastFlow()
- }
- }
- }
- }
- func stopFastFlow() {
- fastFlowTimer?.invalidate()
- fastFlowTimer = nil
- }
- func isFastFlow() -> Bool {
- return fastFlowTimer != nil && fastFlowTimer!.isValid
- }
- func fastFlow() {
- if isFastFlow() {
- stopFastFlow()
- } else {
- startFastFlow()
- }
- }
- }
-
|