Posts

Post marked as solved
1 Replies
The problem is resolved
Post not yet marked as solved
3 Replies
let txtVw = subVws as! UITextViewClaude31 thiscode work well in ios 12
Post not yet marked as solved
2 Replies
Hi Claude i add one text box and user can change place the text box with finger in one pdf file its correct my code in ios 12 but user can't change move textbox in ios 13 : if you need i can send you a sample project// // BookViewController.swift // BookReader import UIKit import PDFKit import MessageUI import UIKit.UIGestureRecognizerSubclass import Social import MobileCoreServices class BookViewController: UIViewController, UIPopoverPresentationControllerDelegate, PDFViewDelegate, ActionMenuViewControllerDelegate, SearchViewControllerDelegate, ThumbnailGridViewControllerDelegate, OutlineViewControllerDelegate, BookmarkViewControllerDelegate, UITextViewDelegate, UIPickerViewDelegate, UIPickerViewDataSource, UIDocumentPickerDelegate, choosedColorProtocol { var pdfDocument: PDFDocument? var pdfNewDocument: PDFDocument? var docController: UIDocumentInteractionController? @IBOutlet weak var pdfView: PDFView! @IBOutlet weak var pdfThumbnailViewContainer: UIView! @IBOutlet weak var pdfThumbnailView: PDFThumbnailView! @IBOutlet private weak var pdfThumbnailViewHeightConstraint: NSLayoutConstraint! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var titleLabelContainer: UIView! @IBOutlet weak var pageNumberLabel: UILabel! @IBOutlet weak var pageNumberLabelContainer: UIView! let tableOfContentsToggleSegmentedControl = UISegmentedControl(items: [ imageLiteral(resourceName: "Grid"), imageLiteral(resourceName: "List"), imageLiteral(resourceName: "Bookmark-N")]) @IBOutlet weak var thumbnailGridViewConainer: UIView! @IBOutlet weak var outlineViewConainer: UIView! @IBOutlet weak var bookmarkViewConainer: UIView! var lastPoint = CGPoint() var lastLocationPoint = CGPoint() var currentPointSelec = CGPoint() var BezierPath = UIBezierPath() var pdfBezierPath = UIBezierPath() var pdfClickedRow : Int = 77 var touchCount : Int = 0 var previousTouchCount : Int = 0 var isTouchMoved : Bool = false var layerPathArr = [Int : [CGPath]]() var toDeleteLayerName = String() var inkAnnotationArr = [PDFAnnotation]() var bookmarkButton: UIBarButtonItem! var searchNavigationController: UINavigationController? let barHideOnTapGestureRecognizer = UITapGestureRecognizer() let pdfViewGestureRecognizer = PDFViewGestureRecognizer() var whichTask = String() var spacingNumber : CGFloat = 10.0 var colorForeground = UIColor() var AddTextCount : Int = 0 var drawNumCount = Int() var heightYOrgin = CGFloat() var getHighlightColor = UIColor() var lastTextAnnoPoint = CGPoint() @IBOutlet weak var blackSaveButVw: UIView! // FOR COLOR CHANGE @IBOutlet weak var bottomColorView: UIView! @IBOutlet weak var redClrVw: UIView! @IBOutlet weak var brownClrVw: UIView! @IBOutlet weak var yelloClrVw: UIView! @IBOutlet weak var magentaClrVw: UIView! @IBOutlet weak var darkGrayClrVw: UIView! @IBOutlet weak var blueClrVw: UIView! @IBOutlet weak var greenClrVw: UIView! @IBOutlet weak var blackClrVw: UIView! @IBOutlet weak var actionsButStckVw: UIStackView! //TO DRAW @IBOutlet weak var editActionButStckVw: UIStackView! @IBOutlet weak var drawView: UIView! // FOR TEXT var isDoneButtonPressed = false @IBOutlet weak var sideWidthHeightVw: UIView! @IBOutlet weak var spacingLbl: UILabel! @IBOutlet weak var widthDiffImgVw: UIImageView! @IBOutlet weak var heightDifImgVw: UIImageView! @IBOutlet weak var topMoveImgVw: UIImageView! @IBOutlet weak var bottomMoveImgVw: UIImageView! @IBOutlet weak var leftMoveImgVw: UIImageView! @IBOutlet weak var rightMoveImgVw: UIImageView! var gettinfFileURL : URL? var pdfPagesImgArr = [UIImage]() var signingPath = UIBezierPath() var annotationAdded = false var currentAnnotation : PDFAnnotation? var addTextViewArr = [UITextView]() var addTxtCount : String = "" var pdfLandingView = UIView() var fontChangePickerView = UIPickerView() var currentTypeTxtVw = UITextView() var textAnnoStoredDict = [String : [String:Any]]() //TEXT STORED USER DEFAULT var totalBezierPathDict = [String : [[String:Any]]]() //BEZIERPATH STORED USER DEFAULT var BezierPathAddArr = [[String:Any]]() var currentDrawAddArr = [[String:Any]]() var PreviousBezierPathAddArr = [[String:Any]]() @IBOutlet weak var FontToolBarVw: UIView! @IBOutlet weak var setBtn: UIButton! @IBOutlet weak var fontNameLbl: UILabel! @IBOutlet weak var fontClrVw: UIView! var fontNam : String = "Helvetica Neue" // ARIAL // Verdana // Times New Roman // Georgia // Courier New var fontFamilyName = [Int : String]() var highLightText = String() var isMenuColorClicked : Bool = true var fontSizeList : [Int : CGFloat] = [ 0 : 12, 1 : 14, 2 : 16, 3 : 18, 4 : 20, 5 : 22, 6 : 24, 7 : 26, 8 : 28, 9 : 30, 10 : 32, 11 : 34 ] var bgOpacityList : [Int : CGFloat] = [ 0 : 0.0, 1 : 0.1, 2 : 0.2, 3 : 0.3, 4 : 0.4, 5 : 0.5, 6 : 0.6, 7 : 0.7, 8 : 0.8, 9 : 0.9, 10 : 1.0 ] var fontColorList = [ 0 : UIColor.black, 1 : UIColor.blue, 2 : UIColor.brown, 3 : UIColor.cyan, 4 : UIColor.darkGray, 5 : UIColor.green, 6 : UIColor.lightGray, 7 : UIColor.magenta, 8 : UIColor.orange, 9 : UIColor.red, 10 : UIColor.white, 11 : UIColor.yellow ] var bgChangecolor = UIColor() var usingFontName = "Helvetica Neue" var usingFontColor = UIColor.black var usingFontSize = 12 var usingWidthText = CGFloat() var usingHeightText = CGFloat() var usingBGFontColor = UIColor.black var usingBGFontAlpha : CGFloat = 0.2 var usingTextVwNumber : Int = 0 var selectedBGRowColor = 0 var selectedBGAlpha : Int = 5 var selectedRowFont = Int() var selectedRowColor = 0 var selectedRowSize = 0 var linkAnn = PDFAnnotation() var PdfImagesArr = [UIImage]() var addWindow = UIApplication.shared.keyWindow var newVw = UIView() var textVwMovedX = CGFloat() var textVwMovedY = CGFloat() let needFont = ["Helvetica Neue", "Arial", "Verdana", "Times New Roman", "Georgia", "Courier New"] var fontList = [Int : [[String : Any]]]() var hasKeyboardChanged : Bool = false var whichPickerView = String() var pdfChoosedRowNumber = String() var ColorMenu = UIMenuController.shared let deviceIdiom = UIScreen.main.traitCollection.userInterfaceIdiom var isTypeTextVwChanged : Bool = false override func viewDidLoad() { super.viewDidLoad() definesPresentationContext = true var forCount : Int = 0 print("clikdRow ", pdfClickedRow) pdfChoosedRowNumber = "pdfChoosedRowNumber" + String(pdfClickedRow) highLightText = "highLightText" for familyName:String in UIFont.familyNames { // print("\n\nFamily Name: \(familyName)") let contains = needFont.contains(where: { $0 == familyName }) if contains == true { if familyName == "Helvetica Neue" { selectedRowFont = forCount } fontFamilyName[forCount] = familyName forCount = forCount + 1 } // for fontName:String in UIFont.fontNames(forFamilyName: familyName) { // print("--Font Name: \(fontName)") // } } // let newwindow = UIWindow(frame: UIScreen.main.bounds) // newwindow.backgroundColor = UIColor.brown // newwindow.isHidden = false // newwindow.windowLevel = UIWindowLevelAlert // newwindow.makeKeyAndVisible() // window.addSubview(someView) fontClrVw.layer.cornerRadius = 7.5 print("fontFamilyNamefontFamilyName ", fontFamilyName) fontNameLbl.font = UIFont(name: usingFontName, size: 14) fontNameLbl.text = " - " + String(usingFontSize) + " - " + usingFontName fontNameLbl.textColor = usingFontColor fontClrVw.backgroundColor = usingFontColor bottomColorView.isHidden = true actionsButStckVw.isHidden = true sideWidthHeightVw.isHidden = true colorForeground = UIColor.black editActionButStckVw.isHidden = true whichTask = "goingToEdit" drawView.isHidden = true currentTypeTxtVw.delegate = self fontChangePickerView.delegate = self fontChangePickerView.dataSource = self NotificationCenter.default.addObserver(self, selector: #selector(pdfViewPageChanged(_:)), name: .PDFViewPageChanged, object: nil) barHideOnTapGestureRecognizer.addTarget(self, action: #selector(gestureRecognizedToggleVisibility(_:))) view.addGestureRecognizer(barHideOnTapGestureRecognizer) tableOfContentsToggleSegmentedControl.selectedSegmentIndex = 0 tableOfContentsToggleSegmentedControl.addTarget(self, action: #selector(toggleTableOfContentsView(_:)), for: .valueChanged) pdfView.autoScales = true pdfView.displayMode = .singlePage pdfView.displayDirection = .horizontal pdfView.usePageViewController(true, withViewOptions: [UIPageViewControllerOptionInterPageSpacingKey: 20]) pdfView.addGestureRecognizer(pdfViewGestureRecognizer) // drawPDFfromURL(url: pdfNewDocument?.documentURL as! NSURL) // ConvertImagesToPages() pdfView.document = pdfDocument pdfThumbnailView.layoutMode = .horizontal pdfThumbnailView.pdfView = pdfView titleLabel.text = pdfDocument?.documentAttributes?["Title"] as? String titleLabelContainer.layer.cornerRadius = 4 pageNumberLabelContainer.layer.cornerRadius = 4 let menuItem3 = UIMenuItem(title: "Draw", action: #selector(drawingOnPDF)) let menuItem4 = UIMenuItem(title: "Text", action: #selector(TextOnPDF)) let menuItem1 = UIMenuItem(title: "Highlight", action: #selector(highlightTextColor)) UIMenuController.shared.menuItems = [menuItem1] //, menuItem4] resume() ColorBorderCustomisation() getHighlightColor = UIColor.orange NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(menuWillHide), name: NSNotification.Name.UIMenuControllerWillHideMenu, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(menuWillShow), name: NSNotification.Name.UIMenuControllerWillShowMenu, object: nil) } override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() adjustThumbnailViewHeight() } @objc func highlightTextColor() { whichTask = "highLightText" ActionHighLight() ColorListHighlight() isMenuColorClicked = false } @objc func menuWillShow(notif: NSNotification) { print("Meu_Shwing") // removeHighlightAnno() } @objc func menuWillHide(notif: NSNotification) { // if whichTask == "colorPickAppeared" // { // print("foundBadSce") // whichTask = "goingToEdit" // let menuItem1 = UIMenuItem(title: "Highlight", action: #selector(highlightTextColor)) // UIMenuController.shared.menuItems = [menuItem1] // } // becomeFirstResponder() // whichTask = "goingToEdit" // UIMenuController.shared.isMenuVisible = true if isMenuColorClicked == false{ whichTask = "goingToEdit" print("dfgdfsgdf", ColorMenu.isMenuVisible) ColorMenu.menuItems = [] let menuItem1 = UIMenuItem(title: "Highlight", action: #selector(highlightTextColor)) UIMenuController.shared.menuItems = [menuItem1] } print("Meu_Hding") } func ActionHighLight() { removeHighlightAnno() } func addColorHighLights() { let selections = pdfView.currentSelection?.selectionsByLine() // Simple scenario, assuming your pdf is single-page. guard let page = selections?.first?.pages.first else { return } selections?.forEach({ selection in // pdfView.currentPage.se let highlight = PDFAnnotation(bounds: selection.bounds(for: page), forType: .highlight, withProperties: nil) highlight.endLineStyle = .square highlight.color = getHighlightColor whichTask = "goingToEdit" let menuItem1 = UIMenuItem(title: "Highlight", action: #selector(highlightTextColor)) UIMenuController.shared.menuItems = [menuItem1] page.addAnnotation(highlight) }) } func removeHighlightAnno() { var recHL = CGRect() let selections = pdfView.currentSelection?.selectionsByLine() // Simple scenario, assuming your pdf is single-page. guard let page = selections?.first?.pages.first else { return } selections?.forEach({ selection in recHL = selection.bounds(for: page) print("recHLrecHL ", recHL) let anno = pdfView.currentPage?.annotation(at: CGPoint(x: recHL.origin.x, y: recHL.origin.y)) print("asdasdasd ", anno?.type) print("->>Tot_ann ", pdfView.currentPage?.annotations) if anno?.type == "Highlight" { pdfView.currentPage?.removeAnnotation(anno!) } if anno?.type == nil { for allInn in (pdfView.currentPage?.annotations)! { if allInn.type == "Highlight" { if Int(allInn.bounds.origin.x) == Int(recHL.origin.x) { if Int(allInn.bounds.origin.y) == Int(recHL.origin.y) { print("ano_rem") pdfView.currentPage?.removeAnnotation(allInn) // break } } } } } }) print("fdsdsfsf") } //MARK:- SPACING MENU func ColorListHighlight() { // becomeFirstResponder() let red : UIMenuItem = UIMenuItem(title: "Red", action: #selector(spacingRed)) let blue = UIMenuItem(title: "Blue", action: #selector(spacingCyan)) let yellow = UIMenuItem(title: "Yellow", action: #selector(spacingYellow)) let orange = UIMenuItem(title: "Orange", action: #selector(spacingOrange)) let purple = UIMenuItem(title: "Purple", action: #selector(spacingPurple)) ColorMenu.menuItems = [red, blue, yellow, orange, purple] ColorMenu.setMenuVisible(true, animated: true) // whichTask = "colorPickAppeared" } @objc func spacingRed() { getHighlightColor = UIColor.red addColorHighLights() isMenuColorClicked = true } @objc func spacingCyan() { getHighlightColor = UIColor.cyan addColorHighLights() isMenuColorClicked = true } @objc func spacingYellow() { getHighlightColor = UIColor.yellow addColorHighLights() isMenuColorClicked = true } @objc func spacingOrange() { getHighlightColor = UIColor.orange addColorHighLights() isMenuColorClicked = true } @objc func spacingPurple() { getHighlightColor = UIColor.purple addColorHighLights() isMenuColorClicked = true } override func viewDidAppear(_ animated: Bool) { if let getValuesData = UserDefaults.standard.value(forKey: "TextStorage") as? NSData { textAnnoStoredDict = NSKeyedUnarchiver.unarchiveObject(with: getValuesData as Data) as! [String : [String:Any]] print("getValuestexttoredDict ", textAnnoStoredDict) } else { print("Nthn In UserDef") } if let getPathsData = UserDefaults.standard.value(forKey: "BezierPathStorage") as? NSData { totalBezierPathDict = NSKeyedUnarchiver.unarchiveObject(with: getPathsData as Data) as! [String : [[String:Any]]] print("totalBezierPathDicttotalBezierPathDict ", totalBezierPathDict) print("0th PAge") let getPagenumber : Int = (pdfDocument?.index(for: pdfView.currentPage!))! previousDrawAddedInPage() getPreviousDrawOnCurrentPage(currPageNum: getPagenumber) } else { print("Nthn Datas In UserDef") } } override func viewWillDisappear(_ animated: Bool) { } func getPDFLocation() { let url = Bundle.main.url(forResource: "Sample", withExtension: "pdf")! let pdfData = NSData(contentsOf: url) // get the documents directory url let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! // choose a name for your image let fileName = "new.pdf" // create the destination file url to save your image let fileURL = documentsDirectory.appendingPathComponent(fileName) gettinfFileURL = fileURL // get your UIImage jpeg data representation and check if the destination file url already exists if let data = pdfData, !FileManager.default.fileExists(atPath: fileURL.path) { do { // writes the image data to disk try data.write(to: fileURL) print("file saved ", fileURL) } catch { print("error saving file: ", error) } } } func ColorBorderCustomisation() { redClrVw.backgroundColor = UIColor.red brownClrVw.backgroundColor = UIColor.brown yelloClrVw.backgroundColor = UIColor.yellow magentaClrVw.backgroundColor = UIColor.magenta darkGrayClrVw.backgroundColor = UIColor.orange blueClrVw.backgroundColor = UIColor.blue greenClrVw.backgroundColor = UIColor.green blackClrVw.backgroundColor = UIColor.black redClrVw.layer.cornerRadius = 10 brownClrVw.layer.cornerRadius = 10 yelloClrVw.layer.cornerRadius = 10 magentaClrVw.layer.cornerRadius = 10 darkGrayClrVw.layer.cornerRadius = 10 blueClrVw.layer.cornerRadius = 10 greenClrVw.layer.cornerRadius = 10 blackClrVw.layer.cornerRadius = 10 widthDiffImgVw.image = widthDiffImgVw.image!.withRenderingMode(.alwaysTemplate) widthDiffImgVw.tintColor = UIColor.orange heightDifImgVw.image = heightDifImgVw.image!.withRenderingMode(.alwaysTemplate) heightDifImgVw.tintColor = UIColor.orange topMoveImgVw.image = topMoveImgVw.image!.withRenderingMode(.alwaysTemplate) topMoveImgVw.tintColor = UIColor.orange bottomMoveImgVw.image = bottomMoveImgVw.image!.withRenderingMode(.alwaysTemplate) bottomMoveImgVw.tintColor = UIColor.orange leftMoveImgVw.image = leftMoveImgVw.image!.withRenderingMode(.alwaysTemplate) leftMoveImgVw.tintColor = UIColor.orange rightMoveImgVw.image = rightMoveImgVw.image!.withRenderingMode(.alwaysTemplate) rightMoveImgVw.tintColor = UIColor.orange } override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) { coordinator.animate(alongsideTransition: { (context) in self.adjustThumbnailViewHeight() }, completion: nil) } private func adjustThumbnailViewHeight() { self.pdfThumbnailViewHeightConstraint.constant = 44 + self.view.safeAreaInsets.bottom } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let viewController = segue.destination as? ThumbnailGridViewController { viewController.pdfDocument = pdfDocument viewController.delegate = self } else if let viewController = segue.destination as? OutlineViewController { viewController.pdfDocument = pdfDocument viewController.delegate = self } else if let viewController = segue.destination as? BookmarkViewController { viewController.pdfDocument = pdfDocument viewController.delegate = self } } override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) { print("Dismiss123123123: \(self.presentedViewController)") super.dismiss(animated: flag, completion: completion) } func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { return .none } func popoverPresentationControllerShouldDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) -> Bool { return false } func actionMenuViewControllerShareDocument(_ actionMenuViewController: ActionMenuViewController) { self.dismiss(animated: true, completion: nil) let url = Bundle.main.url(forResource: "Sample", withExtension: "pdf")! docController = UIDocumentInteractionController(url: url) docController?.delegate = self docController?.presentOptionsMenu(from: self.view.frame, in:self.view, animated:true) } func share(url: URL) { docController?.url = url docController?.uti = url.typeIdentifier ?? "public.data, public.content" docController?.name = url.localizedName ?? url.lastPathComponent docController?.presentOptionsMenu(from: view.frame, in: view, animated: true) } func actionMenuViewControllerPrintDocument(_ actionMenuViewController: ActionMenuViewController) { let printInteractionController = UIPrintInteractionController.shared printInteractionController.printingItem = pdfDocument?.dataRepresentation() printInteractionController.present(animated: true, completionHandler: nil) } func searchViewController(_ searchViewController: SearchViewController, didSelectSearchResult selection: PDFSelection) { selection.color = .yellow pdfView.currentSelection = selection pdfView.go(to: selection) showBars() } func thumbnailGridViewController(_ thumbnailGridViewController: ThumbnailGridViewController, didSelectPage page: PDFPage) { resume() pdfView.go(to: page) } func outlineViewController(_ outlineViewController: OutlineViewController, didSelectOutlineAt destination: PDFDestination) { resume() pdfView.go(to: destination) } func bookmarkViewController(_ bookmarkViewController: BookmarkViewController, didSelectPage page: PDFPage) { resume() pdfView.go(to: page) } private func resume() { let backButton = UIBarButtonItem(image: imageLiteral(resourceName: "Chevron"), style: .plain, target: self, action: #selector(back(_:))) let tableOfContentsButton = UIBarButtonItem(image: imageLiteral(resourceName: "List"), style: .plain, target: self, action: #selector(showTableOfContents(_:))) let actionButton = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(showActionMenu(_:))) navigationItem.leftBarButtonItems = [backButton, tableOfContentsButton, actionButton] let brightnessButton = UIBarButtonItem(image: imageLiteral(resourceName: "Brightness"), style: .plain, target: self, action: #selector(showAppearanceMenu(_:))) let searchButton = UIBarButtonItem(image: imageLiteral(resourceName: "Search"), style: .plain, target: self, action: #selector(showSearchView(_:))) bookmarkButton = UIBarButtonItem(image: imageLiteral(resourceName: "Bookmark-N"), style: .plain, target: self, action: #selector(addOrRemoveBookmark(_:))) let composeButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.compose, target: self, action: #selector(toEditPDFPage(_:))) navigationItem.rightBarButtonItems = [composeButton,bookmarkButton, searchButton, brightnessButton] pdfThumbnailViewContainer.alpha = 1 pdfView.isHidden = false titleLabelContainer.alpha = 1 pageNumberLabelContainer.alpha = 1 thumbnailGridViewConainer.isHidden = true outlineViewConainer.isHidden = true barHideOnTapGestureRecognizer.isEnabled = true updateBookmarkStatus() updatePageNumberLabel() } private func showTableOfContents() { view.exchangeSubview(at: 0, withSubviewAt: 1) view.exchangeSubview(at: 0, withSubviewAt: 2) let backButton = UIBarButtonItem(image: imageLiteral(resourceName: "Chevron"), style: .plain, target: self, action: #selector(back(_:))) let tableOfContentsToggleBarButton = UIBarButtonItem(customView: tableOfContentsToggleSegmentedControl) let resumeBarButton = UIBarButtonItem(title: NSLocalizedString("Resume", comment: ""), style: .plain, target: self, action: #selector(resume(_:))) navigationItem.leftBarButtonItems = [backButton, tableOfContentsToggleBarButton] navigationItem.rightBarButtonItems = [resumeBarButton] pdfThumbnailViewContainer.alpha = 0 toggleTableOfContentsView(tableOfContentsToggleSegmentedControl) barHideOnTapGestureRecognizer.isEnabled = false } @objc func resume(_ sender: UIBarButtonItem) { resume() } @objc func back(_ sender: UIBarButtonItem) { navigationController?.popViewController(animated: true) } @objc func showTableOfContents(_ sender: UIBarButtonItem) { showTableOfContents() } @objc func showActionMenu(_ sender: UIBarButtonItem) { if let viewController = storyboard?.instantiateViewController(withIdentifier: String(describing: ActionMenuViewController.self)) as? ActionMenuViewController { viewController.modalPresentationStyle = .popover viewController.preferredContentSize = CGSize(width: 300, height: 88) viewController.popoverPresentationController?.barButtonItem = sender viewController.popoverPresentationController?.permittedArrowDirections = .up viewController.popoverPresentationController?.delegate = self viewController.delegate = self present(viewController, animated: true, completion: nil) } } @objc func showAppearanceMenu(_ sender: UIBarButtonItem) { if let viewController = storyboard?.instantiateViewController(withIdentifier: String(describing: AppearanceViewController.self)) as? AppearanceViewController { viewController.modalPresentationStyle = .popover viewController.preferredContentSize = CGSize(width: 300, height: 44) viewController.popoverPresentationController?.barButtonItem = sender viewController.popoverPresentationController?.permittedArrowDirections = .up viewController.popoverPresentationController?.delegate = self present(viewController, animated: true, completion: nil) } } @objc func showSearchView(_ sender: UIBarButtonItem) { if let searchNavigationController = self.searchNavigationController { present(searchNavigationController, animated: true, completion: nil) } else if let navigationController = storyboard?.instantiateViewController(withIdentifier: String(describing: SearchViewController.self)) as? UINavigationController, let searchViewController = navigationController.topViewController as? SearchViewController { searchViewController.pdfDocument = pdfDocument searchViewController.delegate = self present(navigationController, animated: true, completion: nil) searchNavigationController = navigationController } } @objc func addOrRemoveBookmark(_ sender: UIBarButtonItem) { if let documentURL = pdfDocument?.documentURL?.absoluteString { var bookmarks = UserDefaults.standard.array(forKey: documentURL) as? [Int] ?? [Int]() if let currentPage = pdfView.currentPage, let pageIndex = pdfDocument?.index(for: currentPage) { if let index = bookmarks.index(of: pageIndex) { bookmarks.remove(at: index) UserDefaults.standard.set(bookmarks, forKey: documentURL) bookmarkButton.image = imageLiteral(resourceName: "Bookmark-N") } else { UserDefaults.standard.set((bookmarks + [pageIndex]).sorted(), forKey: documentURL) bookmarkButton.image = imageLiteral(resourceName: "Bookmark-P") } } } } @objc func toEditPDFPage(_ sender: UIBarButtonItem) { editActionButStckVw.isHidden = false barHideOnTapGestureRecognizer.isEnabled = false hideBars() whichTask = "text" // deleteInKAnno() // showPickerPop() } @objc func toggleTableOfContentsView(_ sender: UISegmentedControl) { pdfView.isHidden = true titleLabelContainer.alpha = 0 pageNumberLabelContainer.alpha = 0 if tableOfContentsToggleSegmentedControl.selectedSegmentIndex == 0 { thumbnailGridViewConainer.isHidden = false outlineViewConainer.isHidden = true bookmarkViewConainer.isHidden = true } else if tableOfContentsToggleSegmentedControl.selectedSegmentIndex == 1 { thumbnailGridViewConainer.isHidden = true outlineViewConainer.isHidden = false bookmarkViewConainer.isHidden = true } else { thumbnailGridViewConainer.isHidden = true outlineViewConainer.isHidden = true bookmarkViewConainer.isHidden = false } } @objc func pdfViewPageChanged(_ notification: Notification) { BezierPathAddArr.removeAll() inkAnnotationArr.removeAll() if pdfViewGestureRecognizer.isTracking { hideBars() let getPagenumber : Int = (pdfDocument?.index(for: pdfView.currentPage!))! getPreviousDrawOnCurrentPage(currPageNum: getPagenumber) // print("getVBezierPathAddArr ", BezierPathAddArr) } else { } updateBookmarkStatus() updatePageNumberLabel() drawNumCount = BezierPathAddArr.count } @objc func gestureRecognizedToggleVisibility(_ gestureRecognizer: UITapGestureRecognizer) { if let navigationController = navigationController { if navigationController.navigationBar.alpha > 0 { hideBars() } else { showBars() } } } private func updateBookmarkStatus() { if let documentURL = pdfDocument?.documentURL?.absoluteString, let bookmarks = UserDefaults.standard.array(forKey: documentURL) as? [Int], let currentPage = pdfView.currentPage, let index = pdfDocument?.index(for: currentPage) { bookmarkButton.image = bookmarks.contains(index) ? imageLiteral(resourceName: "Bookmark-P") : imageLiteral(resourceName: "Bookmark-N") } } private func updatePageNumberLabel() { if let currentPage = pdfView.currentPage, let index = pdfDocument?.index(for: currentPage), let pageCount = pdfDocument?.pageCount { pageNumberLabel.text = String(format: "%d/%d", index + 1, pageCount) } else { pageNumberLabel.text = nil } } private func showBars() { if let navigationController = navigationController { UIView.animate(withDuration: CATransaction.animationDuration()) { navigationController.navigationBar.alpha = 1 self.pdfThumbnailViewContainer.alpha = 1 self.titleLabelContainer.alpha = 1 self.pageNumberLabelContainer.alpha = 1 navigationController.navigationBar.isHidden = false self.pdfThumbnailViewContainer.isHidden = false self.titleLabelContainer.isHidden = false self.pageNumberLabelContainer.isHidden = false } } } private func hideBars() { if let navigationController = navigationController { UIView.animate(withDuration: CATransaction.animationDuration()) { navigationController.navigationBar.alpha = 0 self.pdfThumbnailViewContainer.alpha = 0 self.titleLabelContainer.alpha = 0 self.pageNumberLabelContainer.alpha = 0 navigationController.navigationBar.isHidden = true self.pdfThumbnailViewContainer.isHidden = true self.titleLabelContainer.isHidden = true self.pageNumberLabelContainer.isHidden = true } } } override func touchesBegan(_ touches: Set, with event: UIEvent?) { pdfBezierPath.removeAllPoints() if let touch = touches.first { isTouchMoved = false if touch.view == drawView { let position = touch.location(in: drawView) print("\n\npositionBefo ",position) guard let page = pdfView.page(for: position, nearest: true) else { return } let locationOnPage = pdfView.convert(position, to: page) lastLocationPoint = locationOnPage lastPoint = position pdfBezierPath.move(to: locationOnPage) } } } override func touchesMoved(_ touches: Set, with event: UIEvent?) { if let touch = touches.first { if touch.view == drawView { isTouchMoved = true let position = touch.location(in: drawView) guard let page = pdfView.page(for: position, nearest: true) else { return } let locationOnPage = pdfView.convert(position, to: page) currentPointSelec = position BezierPath.move(to: lastPoint) BezierPath.addLine(to: currentPointSelec) pdfBezierPath.move(to: lastLocationPoint) pdfBezierPath.addLine(to: locationOnPage) let shapeLayer = CAShapeLayer() shapeLayer.name = String(touchCount) shapeLayer.path = BezierPath.cgPath shapeLayer.strokeColor = colorForeground.cgColor shapeLayer.fillColor = UIColor.clear.cgColor shapeLayer.lineWidth = 5.0 drawView.layer.addSublayer(shapeLayer) lastPoint = currentPointSelec lastLocationPoint = locationOnPage } } } override func touchesEnded(_ touches: Set, with event: UIEvent?) { if let touch = touches.first { if touch.view == drawView { let position = touch.location(in: drawView) guard let page = pdfView.page(for: position, nearest: true) else { return } let pageBounds = pdfView.currentPage?.bounds(for: .mediaBox) let b = PDFBorder() b.lineWidth = 10.0 let inkAnnotation = PDFAnnotation(bounds: pageBounds!, forType: PDFAnnotationSubtype.ink, withProperties: nil) inkAnnotation.add(pdfBezierPath) // inkAnnotation.backgroundColor = UIColor.yellow inkAnnotation.border = b inkAnnotation.color = colorForeground.withAlphaComponent(0.0) inkAnnotationArr.append(inkAnnotation) print("pdfBezierPathpdfBezierPathpdfBezierPath ", pdfBezierPath) print("BezierPathAddArrBezierPathAddArr ", pdfBezierPath.cgPath.getPathElementsPoints()) // BezierPathAddArr.append() let getPagenumber : Int = (pdfDocument?.index(for: pdfView.currentPage!))! drawNumCount = drawNumCount + 1 var createdDict = [String : Any]() createdDict["BezierPathPoints"] = pdfBezierPath.cgPath.getPathElementsPoints() createdDict["BezierPathColor"] = colorForeground currentDrawAddArr.append(createdDict) // BezierPathAddArr.append(createdDict) // // totalBezierPathDict["fileNumber\(pdfClickedRow)PageNumber\(getPagenumber)"] = BezierPathAddArr // UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: self.totalBezierPathDict), forKey: "BezierPathStorage") // let index = pdfDocument?.index(for: pdfView.currentPage!) // pdfView.document?.page(at: index!)?.addAnnotation(inkAnnotation) pdfView.currentPage?.addAnnotation(inkAnnotation) BezierPath.close() pdfBezierPath.close() BezierPath.removeAllPoints() if isTouchMoved == false { } else { previousTouchCount = previousTouchCount + 1 touchCount = previousTouchCount } } } } func getPreviousDrawOnCurrentPage(currPageNum: Int) { print("HowCurrPageNum ", currPageNum) if totalBezierPathDict.count > 0 { for (key, value) in totalBezierPathDict { let charset = CharacterSet(charactersIn: "fileNumber\(pdfClickedRow)") if key.rangeOfCharacter(from: charset) != nil { let gettPageNum = Int(key.components(separatedBy: "PageNumber")[1]) if gettPageNum == currPageNum { for path in value { print("Pathqwe1234234234") BezierPathAddArr.append(path) } break } else { continue } } } } print("HowManyPrevVlaues ", BezierPathAddArr.count) } //MARK: - DRAW ON PDF @objc func drawingOnPDF() { whichTask = "draw" drawView.isHidden = false drawView.backgroundColor = UIColor.clear // drawView.alpha = 0.1 actionsButStckVw.isHidden = false bottomColorView.isHidden = false sideWidthHeightVw.isHidden = true barHideOnTapGestureRecognizer.isEnabled = false hideBars() } @objc func TextOnPDF() { drawView.isHidden = true drawView.backgroundColor = UIColor.clear actionsButStckVw.isHidden = false whichTask = "text" let linkAnn = PDFAnnotation.init(bounds: CGRect(x: 150, y: 450, width: 150, height: 100), forType: PDFAnnotationSubtype.widget, withProperties: nil) linkAnn.widgetFieldType = .text linkAnn.isMultiline = true linkAnn.widgetStringValue = "\(AddTextCount + 1). " linkAnn.font = .systemFont(ofSize: 20) linkAnn.fontColor = UIColor.darkGray linkAnn.backgroundColor = UIColor.orange.withAlphaComponent(0.2) linkAnn.setValue("addtext\(AddTextCount)", forAnnotationKey: PDFAnnotationKey.name) pdfView.currentPage?.addAnnotation(linkAnn) bottomColorView.isHidden = true bottomColorView.backgroundColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 1.0) sideWidthHeightVw.backgroundColor = UIColor(red: 240/255, green: 240/255, blue: 240/255, alpha: 1.0) sideWidthHeightVw.isHidden = true barHideOnTapGestureRecognizer.isEnabled = false hideBars() } //MARK: - ANNOTATION EDIT TAP ACN @IBAction func saveTapAcn(_ sender: UITapGestureRecognizer) { drawView.isHidden = true drawView.layer.sublayers = nil if whichTask == "draw" { print("inkAnnotationArrinkAnnotationArr ", inkAnnotationArr) let index : Int = (pdfDocument?.index(for: pdfView.currentPage!))! for anno in inkAnnotationArr { anno.color = colorForeground pdfView.document?.page(at: index)?.addAnnotation(anno) } for i in currentDrawAddArr { var dict = i dict["BezierPathColor"] = colorForeground BezierPathAddArr.append(dict) } // BezierPathAddArr.append(currentDrawAddArr) totalBezierPathDict["fileNumber\(pdfClickedRow)PageNumber\(index)"] = BezierPathAddArr UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: self.totalBezierPathDict), forKey: "BezierPathStorage") } else if whichTask == "text" { // AddTextCount = AddTextCount + 1 // UserDefaults.standard.set(AddTextCount, forKey: "addTextCount") } actionsButStckVw.isHidden = true sideWidthHeightVw.isHidden = true bottomColorView.isHidden = true whichTask = "goingToEdit" let menuItem3 = UIMenuItem(title: "Draw", action: #selector(drawingOnPDF)) let menuItem4 = UIMenuItem(title: "Text", action: #selector(TextOnPDF)) UIMenuController.shared.menuItems = [menuItem3, menuItem4] editActionButStckVw.isUserInteractionEnabled = true editActionButStckVw.alpha = 1.0 currentDrawAddArr.removeAll() inkAnnotationArr.removeAll() } @IBAction func deleteTapAcn(_ sender: UITapGestureRecognizer) { } func distance(from lhs: CGPoint, to rhs: CGPoint) -> CGFloat { return hypot(lhs.x.distance(to: rhs.x), lhs.y.distance(to: rhs.y)) } @IBAction func cancelTapAcn(_ sender: UITapGestureRecognizer) { print("cancel_Tap") drawView.isHidden = true drawView.layer.sublayers = nil sideWidthHeightVw.isHidden = true bottomColorView.isHidden = true actionsButStckVw.isHidden = true if whichTask == "draw" { inkAnnotationArr.removeAll() currentDrawAddArr.removeAll() } if whichTask == "text" { let getAllAnnotations = pdfView.currentPage?.annotations for ann in getAllAnnotations! { let getBounds = ann.bounds if Int(getBounds.origin.x) == Int(lastTextAnnoPoint.x) { if Int(getBounds.origin.y) == Int(lastTextAnnoPoint.y) { pdfView.currentPage?.removeAnnotation(ann) getPDFFrame(todo: "deleteTextVw") // print("-->>annDEnyStyr ", ann.contents) break } } else { } } // MovingTextViewAnnotation(forWhich: "cancel") } whichTask = "goingToEdit" // let menuItem3 = UIMenuItem(title: "Draw", action: #selector(drawingOnPDF)) // let menuItem4 = UIMenuItem(title: "Text", action: #selector(TextOnPDF)) // UIMenuController.shared.menuItems = [menuItem3, menuItem4] editActionButStckVw.isUserInteractionEnabled = true editActionButStckVw.alpha = 1.0 } @IBAction func longPressTapAcn(_ sender: UILongPressGestureRecognizer) { let touchPoint = sender.location(in: self.drawView) // guard let page = pdfView.page(for: touchPoint, nearest: true) else { // return // } print("touchPoint ", touchPoint) print("drawView.layer.sublayersdrawView.layer.sublayers ", drawView.layer.sublayers) for laySub in drawView.layer.sublayers! { if laySub.isKind(of: CAShapeLayer.self) { if laySub.name == "gk" { print("layPoslayPos ", laySub) } } } // let locationOnPage = pdfView.convert(touchPoint, to: page) // page.annotation(at: locationOnPage) } //MARK:- SPACING MENU func SpacingMenuAction() { becomeFirstResponder() let menu = UIMenuController.shared let One = UIMenuItem(title: "1", action: #selector(spacingOne)) let Two = UIMenuItem(title: "2", action: #selector(spacingTwo)) let Five = UIMenuItem(title: "5", action: #selector(spacingFive)) let Eleven = UIMenuItem(title: "11", action: #selector(spacingEleven)) let Seventeen = UIMenuItem(title: "17", action: #selector(spacingSeventeen)) menu.menuItems = [One, Two, Five, Eleven, Seventeen] menu.setTargetRect(CGRect(x:sideWidthHeightVw.frame.origin.x, y:sideWidthHeightVw.frame.origin.y, width: 150, height:50), in: self.drawView) menu.setMenuVisible(true, animated: true) } @objc func spacingOne() { spacingNumber = 1.0 spacingLbl.text = String(Int(spacingNumber)) } @objc func spacingTwo() { spacingNumber = 2.0 spacingLbl.text = String(Int(spacingNumber)) } @objc func spacingFive() { spacingNumber = 5.0 spacingLbl.text = String(Int(spacingNumber)) } @objc func spacingEleven() { spacingNumber = 11.0 spacingLbl.text = String(Int(spacingNumber)) } @objc func spacingSeventeen() { spacingNumber = 17.0 spacingLbl.text = String(Int(spacingNumber)) } func drawAnnotationColorAction() { print("\n\ntoucnt ",touchCount) for i in 0..<touchcount { if drawView.layer.sublayers != nil { for laySub in drawView.layer.sublayers! { if laySub.isKind(of: CAShapeLayer.self) { let caLaye : CAShapeLayer = laySub as! CAShapeLayer caLaye.strokeColor = colorForeground.cgColor } } } } } @IBAction func redColorTapAcn(_ sender: UITapGestureRecognizer) { colorForeground = UIColor.red if whichTask == "text" { MovingTextViewAnnotation(forWhich: "color") } else if whichTask == "draw" { drawAnnotationColorAction() } } @IBAction func brownColorTapAcn(_ sender: UITapGestureRecognizer) { colorForeground = UIColor.brown if whichTask == "text" { MovingTextViewAnnotation(forWhich: "color") } else if whichTask == "draw" { drawAnnotationColorAction() } } @IBAction func yellowColorTapAcn(_ sender: UITapGestureRecognizer) { colorForeground = UIColor.yellow if whichTask == "text" { MovingTextViewAnnotation(forWhich: "color") } else if whichTask == "draw" { drawAnnotationColorAction() } } @IBAction func magentaColorTapAcn(_ sender: UITapGestureRecognizer) { colorForeground = UIColor.magenta if whichTask == "text" { MovingTextViewAnnotation(forWhich: "color") } else if whichTask == "draw" { drawAnnotationColorAction() } } @IBAction func OrangeTapAcn(_ sender: UITapGestureRecognizer) { colorForeground = UIColor.orange if whichTask == "text" { MovingTextViewAnnotation(forWhich: "color") } else if whichTask == "draw" { drawAnnotationColorAction() } } @IBAction func blueTapAcn(_ sender: UITapGestureRecognizer) { colorForeground = UIColor.blue if whichTask == "text" { MovingTextViewAnnotation(forWhich: "color") } else if whichTask == "draw" { drawAnnotationColorAction() } } @IBAction func greenTapAcn(_ sender: UITapGestureRecognizer) { colorForeground = UIColor.green if whichTask == "text" { MovingTextViewAnnotation(forWhich: "color") } else if whichTask == "draw" { drawAnnotationColorAction() } } @IBAction func blackTapAcn(_ sender: UITapGestureRecognizer) { colorForeground = UIColor.black if whichTask == "text" { MovingTextViewAnnotation(forWhich: "color") } else if whichTask == "draw" { drawAnnotationColorAction() } } @IBAction func spacingTapAcn(_ sender: UITapGestureRecognizer) { SpacingMenuAction() } @IBAction func widthTapAcn(_ sender: UITapGestureRecognizer) { MovingTextViewAnnotation(forWhich: "width") } @IBAction func heightTapAcn(_ sender: UITapGestureRecognizer) { MovingTextViewAnnotation(forWhich: "height") } @IBAction func topMoveTapAcn(_ sender: UITapGestureRecognizer) { MovingTextViewAnnotation(forWhich: "bottom") } @IBAction func bottomMoveTapAcn(_ sender: UITapGestureRecognizer) { MovingTextViewAnnotation(forWhich: "top") } @IBAction func leftMoveTapAcn(_ sender: UITapGestureRecognizer) { MovingTextViewAnnotation(forWhich: "left") } @IBAction func rightMoveTapAcn(_ sender: UITapGestureRecognizer) { MovingTextViewAnnotation(forWhich: "right") } //MARK:- KEYBOARD @objc func keyboardWillShow(notification: NSNotification) { if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { let keyboardHeight = keyboardSize.height isDoneButtonPressed = false print("\n\nKBShowingg ------>>> ") // if whichTask == "text" // { if hasKeyboardChanged == false { getPDFFrame(todo: "firstResponder") // whichTask = "firstTry" getPDFFrame(todo: "default") } } } @objc func keyboardWillHide(notification: NSNotification) { hasKeyboardChanged = false if isDoneButtonPressed == false { getPDFFrame(todo: "removeArrowSuviews") switch (deviceIdiom) { case .pad: colorForeground = usingFontColor MovingTextViewAnnotation(forWhich: "color") MovingTextViewAnnotation(forWhich: "font") MovingTextViewAnnotation(forWhich: "BGColor") case .phone: print("iPhonekb and iPod touch style UI") // MovingTextViewAnnotation(forWhich: "height") // MovingTextViewAnnotation(forWhich: "width") // MovingTextViewAnnotation(forWhich: "fingerPan") // // colorForeground = usingFontColor // MovingTextViewAnnotation(forWhich: "color") // MovingTextViewAnnotation(forWhich: "font") // MovingTextViewAnnotation(forWhich: "BGColor") default: print("Unspecified UI idiom") } } print("\n\nKBHidingingg ------>>> ") } func getAllAnnotationInThisPage() { var textAnnoNameArr = [String]() let getAllAnnotations = pdfView.currentPage?.annotations for ann in getAllAnnotations! { if let nameStr = ann.contents as? String { let charset = CharacterSet(charactersIn: "addtext") if nameStr.rangeOfCharacter(from: charset) != nil { print("annannann Bounds ", ann.bounds) textAnnoNameArr.append(nameStr) print("yes") } } } AddTextCount = textAnnoNameArr.count print("textAnnoNameArrtextAnnoNameArr ", textAnnoNameArr.count) print("textAnnoNameArrtextAnnoNameArr ", textAnnoNameArr) } func deleteInKAnno() { let getAllAnnotations = pdfView.currentPage?.annotations for ann in getAllAnnotations! { if ann.type == "Highlight" { print("ann.typeann.type ", ann.type) pdfView.currentPage?.removeAnnotation(ann) } } } func findHavingTextAnnotation(annoPoint: CGPoint) { print("annoPointannoPoint ", annoPoint) whichTask = "text" editActionButStckVw.isHidden = false editActionButStckVw.isUserInteractionEnabled = false editActionButStckVw.alpha = 0.3 // getAllAnnotationInThisPage() let getAllAnnotations = pdfView.currentPage?.annotations for ann in getAllAnnotations! { let getBounds = ann.bounds print("getBounds ", getBounds) print("getBoundsX ", getBounds.origin.x) print("getBoundsY ", getBounds.origin.y) print("getBoundsIntX ", Int(getBounds.origin.x)) print("getBoundsIntY ", Int(getBounds.origin.y)) if Int(getBounds.origin.x) == Int(annoPoint.x) { if Int(getBounds.origin.y) == Int(annoPoint.y) { print("workingGud") let getContentStr : String = ann.contents! let comp = getContentStr.components(separatedBy: "addtext") print("getContentStrgetContentStr ",getContentStr) actionsButStckVw.isHidden = false addTxtCount = comp[1] usingFontColor = ann.fontColor! usingFontName = (ann.font?.fontName)! usingFontSize = Int((ann.font?.fontDescriptor.pointSize)!) let getPagenumber : Int = (pdfDocument?.index(for: pdfView.currentPage!))! print("getPagenumbergetPagenumber ",getPagenumber) print("-->>> fileNumber\(pdfClickedRow)PageNumber\(getPagenumber)addtext\(addTxtCount)") var createdColorDict = [String : Any]() createdColorDict = textAnnoStoredDict["fileNumber\(pdfClickedRow)PageNumber\(getPagenumber)addtext\(addTxtCount)"]! usingBGFontColor = createdColorDict["BGColor"] as! UIColor usingBGFontAlpha = createdColorDict["BGOpacity"] as! CGFloat print("\n\nusingFontColorusingFontColor ", usingFontColor) print("\n\nusfusingsdfdAlpha ", usingBGFontAlpha) for (key, value) in fontColorList { if value == usingFontColor { selectedRowColor = key break } } for (key, value) in fontFamilyName { if value == usingFontName { selectedRowFont = key break } } for (key, value) in fontSizeList { if value == CGFloat(usingFontSize) { selectedRowSize = key break } } for (key, value) in fontColorList { if value == usingBGFontColor { selectedBGRowColor = key break } } for (key, value) in bgOpacityList { if value == usingBGFontAlpha { selectedBGAlpha = key break } } textVwMovedX = ann.bounds.origin.x textVwMovedY = ann.bounds.origin.y + usingHeightText // SET DEFAULT HEIGHT print("\n\nXmovTxt ", textVwMovedX) print("YmovTxt ", textVwMovedY) print("\n") // print("selectselectedRowColorowColor ", selectedRowColor) // print("selectedBGRowColorselectedBGRowColor ", selectedBGRowColor) // print("selectedBGAlphaselectedBGAlpha ", selectedBGAlpha) print("aaalllll annnnn ", ann) return } } } // pdfView.currentPage?.annotation(at: <#T##CGPoint#>) // let ann : PDFAnnotation = (pdfView.currentPage?.annotation(at: CGPoint(x: 35, y: 715)))! // print("ann ",ann.type) // print("ann ",ann.bounds) // print("ann ",ann.backgroundColor) // print("ann ",ann.widgetStringValue) // print("ann ",ann.font) // print("ann ",ann.font?.fontDescriptor.pointSize) // print("ann ",ann.fontColor) // print("ann ",ann.contents) // } } // func getStoredTextViewDetailsFromUserDefaults() // { // //1. TOEDITPDF // // } // func toSaveTextViewDetailsToUserDefaults() // { // //1. BLACKTEXTTAPACN // //2. MOVINGTEXTVIEWANNOTATION // } func MovingTextViewAnnotation(forWhich: String) { if whichTask == "text" { let getAllAnnotations = pdfView.currentPage?.annotations for ann in getAllAnnotations! { if let nameStr = ann.contents as? String { print("nameStrnameStr ", nameStr) let getPagenumber : Int = (pdfDocument?.index(for: pdfView.currentPage!))! print("addTxtCoaddTxtCount ",addTxtCount) if nameStr == "fileNumber\(pdfClickedRow)PageNumber\(getPagenumber)addtext\(addTxtCount)" { print("B: ", ann.bounds) if forWhich == "top" { ann.bounds.origin.y = ann.bounds.origin.y - spacingNumber } else if forWhich == "bottom" { ann.bounds.origin.y = ann.bounds.origin.y + spacingNumber } else if forWhich == "left" { ann.bounds.origin.x = ann.bounds.origin.x - spacingNumber } else if forWhich == "right" { ann.bounds.origin.x = ann.bounds.origin.x + spacingNumber } else if forWhich == "width" { // ann.bounds.size.width = ann.bounds.size.width + spacingNumber // usingWidthText = ann.bounds.size.width // getPDFFrame(todo: "widthChange") ann.bounds.size.width = usingWidthText } else if forWhich == "height" { // ann.bounds.size.height = ann.bounds.size.height + spacingNumber // usingHeightText = ann.bounds.size.height // getPDFFrame(todo: "heightChange") ann.bounds.size.height = usingHeightText } else if forWhich == "color" { ann.fontColor = colorForeground } else if forWhich == "font" { print("CGFloat(usingFontSize)CGFloat(usingFontSize) ", CGFloat(usingFontSize)) ann.font = UIFont(name: usingFontName, size: CGFloat(usingFontSize)) let gettingSize = GettingTextViewSize(getStr: ann.widgetStringValue!, fontSize: CGFloat(usingFontSize), widthAnno: ann.bounds.size.width) if usingHeightText < gettingSize.height { getPDFFrame(todo: "sizeChangeByFont") } print("gettingSizegettingSize ", gettingSize) } else if forWhich == "BGColor" { ann.backgroundColor = usingBGFontColor.withAlphaComponent(usingBGFontAlpha) let getPagenumber : Int = (pdfDocument?.index(for: pdfView.currentPage!))! var createdColorDict = [String : Any]() createdColorDict["BGColor"] = usingBGFontColor createdColorDict["BGOpacity"] = usingBGFontAlpha textAnnoStoredDict["fileNumber\(pdfClickedRow)PageNumber\(getPagenumber)addtext\(addTxtCount)"] = createdColorDict print("OverridetextAnnoStoredDict ", textAnnoStoredDict) } else if forWhich == "fingerPan" { print("\n\ntextMovX ", textVwMovedX) print("textMvY ", textVwMovedY) ann.bounds.origin.x = textVwMovedX ann.bounds.origin.y = textVwMovedY - usingHeightText // TEXTVIEW HEIGHT [100] lastTextAnnoPoint = CGPoint(x: ann.bounds.origin.x, y: ann.bounds.origin.y) } else if forWhich == "cancel" { pdfView.currentPage?.removeAnnotation(ann) } return } } } } } func GettingTextViewSize(getStr : String, fontSize: CGFloat, widthAnno : CGFloat) -> CGSize { var textSize = (getStr as! NSString).size(withAttributes: [NSAttributedStringKey.font : UIFont.systemFont(ofSize: fontSize)]) if textSize.width > widthAnno { // IF STRING WIDTH GREATER THAN TABLEVIEW WIDTH let multipleValue = textSize.width / widthAnno textSize.height = (textSize.height * (multipleValue + 1.0)) textSize.width = widthAnno } else { textSize.height = textSize.height + 5 //ADDING EXTRA SPACE textSize.width = textSize.width + 5 //ADDING EXTRA SPACE } return textSize } @IBAction func blackDrawTapAcn(_ sender: UITapGestureRecognizer) { editActionButStckVw.isUserInteractionEnabled = false editActionButStckVw.alpha = 0.3 // whichTask = "draw" drawView.isHidden = false drawView.backgroundColor = UIColor.clear // drawView.alpha = 0.1 // actionsButStckVw.isHidden = false bottomColorView.isHidden = false sideWidthHeightVw.isHidden = true barHideOnTapGestureRecognizer.isEnabled = false hideBars() } @IBAction func blackTextTapAcn(_ sender: UITapGestureRecognizer) { getAllAnnotationInThisPage() print("afterGetAllAnno") let getPagenumber : Int = (pdfDocument?.index(for: pdfView.currentPage!))! editActionButStckVw.isUserInteractionEnabled = false editActionButStckVw.alpha = 0.3 drawView.isHidden = true drawView.backgroundColor = UIColor.clear actionsButStckVw.isHidden = false whichTask = "text" usingWidthText = 150.0 usingHeightText = 100.0 textVwMovedX = 150 AddTextCount = AddTextCount + 1 print("adTxCou ",AddTextCount) let linkAnn = PDFAnnotation.init(bounds: CGRect(x: 150, y: 450, width: 150, height: usingHeightText), forType: PDFAnnotationSubtype.widget, withProperties: nil) linkAnn.widgetFieldType = .text linkAnn.isMultiline = true linkAnn.contents = "fileNumber\(pdfClickedRow)PageNumber\(getPagenumber)addtext\(AddTextCount)" //"\(AddTextCount)" linkAnn.widgetStringValue = "hi " linkAnn.font = UIFont(name: usingFontName, size: CGFloat(usingFontSize)) linkAnn.fontColor = usingFontColor linkAnn.backgroundColor = usingBGFontColor.withAlphaComponent(usingBGFontAlpha) linkAnn.setValue("addtext\(AddTextCount)", forAnnotationKey: PDFAnnotationKey.name) print("linkAnn.cont ",linkAnn.contents) let index = pdfDocument?.index(for: pdfView.currentPage!) pdfView.document?.page(at: index!)?.addAnnotation(linkAnn) var createdColorDict = [String : Any]() createdColorDict["BGColor"] = usingBGFontColor createdColorDict["BGOpacity"] = usingBGFontAlpha textAnnoStoredDict["fileNumber\(pdfClickedRow)PageNumber\(getPagenumber)addtext\(AddTextCount)"] = createdColorDict // pdfView.currentPage?.addAnnotation(linkAnn) bottomColorView.isHidden = false bottomColorView.backgroundColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 1.0) sideWidthHeightVw.backgroundColor = UIColor(red: 240/255, green: 240/255, blue: 240/255, alpha: 1.0) sideWidthHeightVw.isHidden = true barHideOnTapGestureRecognizer.isEnabled = false hideBars() // getPDFFrame() } @IBAction func blackSaveTapAcn(_ sender: UITapGestureRecognizer) { //ACTION SHEET let actionSheetController: UIAlertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) // create an action let firstAction: UIAlertAction = UIAlertAction(title: "Replace", style: .default) { action -> Void in self.pdfDocument?.write(to: (self.pdfDocument?.documentURL)!) //BEZIERPATH NOT WORKIN print("\n\ntextAnnoStoredDicttextAnnoStoredDictv ", self.textAnnoStoredDict) // UserDefaults.standard.set(self.textAnnoStoredDict, forKey: "TextStorage") UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: self.textAnnoStoredDict), forKey: "TextStorage") self.editActionButStckVw.isHidden = true self.barHideOnTapGestureRecognizer.isEnabled = true self.showBars() print("First Action pressed") } let secondAction: UIAlertAction = UIAlertAction(title: "Create New", style: .default) { action -> Void in if let path = self.pdfDocument?.documentURL?.absoluteString, let document = self.pdfView.document { print("\n\nPath ", path) print("document ", document) // self.pdfDocument?.write(to: (self.pdfDocument?.documentURL)!) self.convertPDFtoImageToShare() let fileManager = FileManager.default do { let documentDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil, create:false) let fileURL : URL = documentDirectory.appendingPathComponent("newsample.pdf") print("\n\nfileURL ", fileURL) // print("document ", document) // for img in self.PdfImagesArr // { // try self.createPDF(image: img)?.write(to: fileURL) // // break // //// self.createPDF(image: img)?.write(to: fileURL, atomically: true) // // // // } var pdfDoc = PDFDocument() // = PDFDocument(url: fileURL)! var pgCoun : Int = 0 for img in 0..<self.pdfimagesarr.count { let c_img = self.PdfImagesArr[img].cgImage let newImg = UIImage(cgImage: c_img!, scale: self.PdfImagesArr[img].scale, orientation: UIImageOrientation.downMirrored) let pfPage : PDFPage = PDFPage(image: newImg)! pdfDoc.insert(pfPage, at: pgCoun) pgCoun = pgCoun + 1 } pdfDoc.write(to: fileURL) } catch { print(error) } } print("Second Action pressed") } let thirdAction: UIAlertAction = UIAlertAction(title: "Remove All", style: .default) { action -> Void in self.editActionButStckVw.isHidden = true self.barHideOnTapGestureRecognizer.isEnabled = true self.showBars() print("remove Action pressed") } let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .cancel) { action -> Void in } // add actions actionSheetController.addAction(firstAction) actionSheetController.addAction(secondAction) actionSheetController.addAction(thirdAction) actionSheetController.addAction(cancelAction) switch (deviceIdiom) { case .pad: actionSheetController.preferredContentSize = CGSize(width:100,height:250) actionSheetController.popoverPresentationController?.sourceView = blackSaveButVw actionSheetController.popoverPresentationController?.sourceRect = CGRect(x:20,y:40,width:0,height:0) // actionSheetController.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem present(actionSheetController, animated: true, completion: nil) case .phone: present(actionSheetController, animated: true, completion: nil) default: print("Unspecified UI idiom") } } @IBAction func blackiCloudTapAcn(_ sender: UITapGestureRecognizer) { let docPickCont = UIDocumentPickerViewController(documentTypes: [String(kUTTypePDF)], in: .import) docPickCont.delegate = self present(docPickCont, animated: true, completion: nil) } func convertPDFtoImageToShare() { let pageCount : Int = (pdfDocument?.pageCount)! for i in 0..<pagecount { let page = pdfDocument?.page(at: i)! let rect = page?.bounds(for: PDFDisplayBox.mediaBox) let renderer = UIGraphicsImageRenderer(size: (rect?.size)!) let image = renderer.image(actions: { context in let cgContext = context.cgContext cgContext.setFillColor(gray: 1, alpha: 1) cgContext.fill(CGRect(x: 0, y: 0, width: (rect?.size.width)!, height: (rect?.size.height)!)) cgContext.translateBy(x: 0, y: (rect?.size.height)!) cgContext.scaleBy(x: 1, y: -1) page?.draw(with: PDFDisplayBox.mediaBox, to: cgContext) print("GoingTofinished") }) PdfImagesArr.append(image) UIGraphicsEndImageContext() } print("finished ", PdfImagesArr.count) let imgVw = UIImageView(frame: self.drawView.frame) imgVw.backgroundColor = UIColor.red imgVw.image = PdfImagesArr[1] self.view.addSubview(imgVw) } func createPDF(image: UIImage) -> NSData? { let pdfData = NSMutableData() let pdfConsumer = CGDataConsumer(data: pdfData as CFMutableData)! var mediaBox = CGRect.init(x: 0, y: 0, width: image.size.width, height: image.size.height) let pdfContext = CGContext(consumer: pdfConsumer, mediaBox: &mediaBox, nil)! pdfContext.beginPage(mediaBox: &mediaBox) pdfContext.draw(image.cgImage!, in: mediaBox) pdfContext.endPage() return pdfData } func getPDFFrame(todo: String) { let pdfSubVws = pdfView.subviews print("subVws ",pdfSubVws) for subVws in pdfSubVws { if (String(describing: subVws).range(of:"UIPageViewControllerContentView") != nil) { let pageVc = subVws.subviews for subVws in pageVc { if (String(describing: subVws).range(of:"UIQueuingScrollView") != nil) { let QueueVc = subVws.subviews // print("QueueVcQueueVc ", QueueVc) for subVws in QueueVc { if (String(describing: subVws).range(of:"UIView") != nil) { let viewVc = subVws.subviews // print("\n\nviewVcVcQueueVc ", viewVc) for subVws in viewVc { if (String(describing: subVws).range(of:"UIView") != nil) { let SubviewVc = subVws.subviews // print("\n\nSubviewVcSubviewVc ", SubviewVc) for subVws in SubviewVc { if (String(describing: subVws).range(of:"UIScrollView") != nil) { let finalVw = subVws.subviews // print("\n\nfinalVw ", finalVw) // for subVws in finalVw { if (String(describing: subVws).range(of:"UIView") != nil) { // print("subVwssubVws ", subVws) let pagView = subVws.subviews // pdfLandingView = for subVws in pagView { // print("\n\n EndVwssubVws ", subVws) if (String(describing: subVws).range(of:"PDFPageView") != nil) { let pageLandVw = subVws.subviews print("\n\n WasVwssubVws ", pageLandVw) for subVws in pageLandVw { if (String(describing: subVws).range(of:"UITextView") != nil) { print("dddddddd") let txtVw = subVws as! UITextView if todo == "firstResponder" { let rect = pdfView.currentPage?.bounds(for: .mediaBox) usingHeightText = txtVw.frame.size.height usingWidthText = txtVw.frame.size.width let xPoint = txtVw.frame.origin.x let yPoint = (rect?.height)! - (txtVw.frame.origin.y) - txtVw.frame.size.height lastTextAnnoPoint = CGPoint(x: xPoint, y: yPoint) findHavingTextAnnotation(annoPoint: CGPoint(x: xPoint, y: yPoint)) // txtVw.contentInset = UIEdgeInsetsMake(0, 10, 0, 0) print("C_Sz ", txtVw.contentSize) print("C_Off ", txtVw.contentOffset) let widthMoveView = UIView(frame: CGRect(x: txtVw.frame.size.width - 20, y: 0, width: 20, height: txtVw.frame.size.height)) widthMoveView.backgroundColor = UIColor.brown.withAlphaComponent(0.0) widthMoveView.tag = 333 let wdImgVw = UIImageView() wdImgVw.frame.origin.x = 0 wdImgVw.frame.origin.y = 8 wdImgVw.frame.size.width = 20 // widthMoveView.frame.width wdImgVw.frame.size.height = 20 // widthMoveView.frame.height wdImgVw.contentMode = .scaleAspectFit wdImgVw.image = UIImage(named: "widthLeftRight") wdImgVw.layer.cornerRadius = 10 // wdImgVw.backgroundColor = UIColor.orange widthMoveView.addSubview(wdImgVw) txtVw.addSubview(widthMoveView) // let tapVw = UIPanGestureRecognizer(target: self, action: #selector(self.handleWidthTapVw(_:))) widthMoveView.addGestureRecognizer(tapVw) } else { // txtVw.tag = AddTextCount txtVw.textColor = usingFontColor txtVw.font = UIFont(name: usingFontName, size: CGFloat(usingFontSize)) txtVw.backgroundColor = nil txtVw.backgroundColor = usingBGFontColor.withAlphaComponent(usingBGFontAlpha) txtVw.delegate = self txtVw.autocorrectionType = .no let iPadShortcut = txtVw.inputAssistantItem iPadShortcut.leadingBarButtonGroups = [] iPadShortcut.trailingBarButtonGroups = [] print("\n\nTAG_TXTVW-->>> ",txtVw.tag) let panGest = UIPanGestureRecognizer(target: self, action: #selector(self.handleTap(_:))) txtVw.addGestureRecognizer(panGest) if todo == "default" { print("\n\n defasdasfs") txtVw.inputView = nil setDoneOnKeyboard(myTextView: txtVw, showButImg: UIImage(named: "editing")!, bgImg: UIImage(named: "textbgcolor")!, kboardIcon: UIImage(named: "keyboard")!, logic: "first") hasKeyboardChanged = true txtVw.reloadInputViews() } if todo == "showPickerView" { print("\n\n showwewrewrasfs") txtVw.inputView = fontChangePickerView setDoneOnKeyboard(myTextView: txtVw, showButImg: UIImage(named: "editing")!, bgImg: UIImage(named: "textbgcolor")!, kboardIcon: UIImage(named: "keyboard")!, logic: "textchange") txtVw.reloadInputViews() } else if todo == "hidePickerView" { print("\n\n hideewrewrasfs") txtVw.inputView = nil setDoneOnKeyboard(myTextView: txtVw, showButImg: UIImage(named: "editing")!, bgImg: UIImage(named: "textbgcolor")!, kboardIcon: UIImage(named: "keyboard")!, logic: "first") txtVw.reloadInputViews() } else if todo == "widthChange" { txtVw.tag = 118 txtVw.frame.size.width = usingWidthText } else if todo == "heightChange" { txtVw.frame.size.height = usingHeightText let rect = pdfView.currentPage?.bounds(for: .mediaBox) textVwMovedY = (rect?.height)! - (txtVw.frame.origin.y) MovingTextViewAnnotation(forWhich: "fingerPan") } else if todo == "sizeChangeByFont" { txtVw.frame.size.height = txtVw.contentSize.height usingHeightText = txtVw.frame.size.height MovingTextViewAnnotation(forWhich: "height") MovingTextViewAnnotation(forWhich: "fingerPan") } else if todo == "removeArrowSuviews" { for subVws in txtVw.subviews { if subVws.tag == 333 { subVws.removeFromSuperview() } } } else if todo == "deleteTextVw" { txtVw.removeFromSuperview() } print("\n\ntxtVwFrame ", txtVw.frame) } return // txtVw.inputView = fontChangePickerView // // setDoneOnKeyboard(myTextView: txtVw) // print("\n\n TxtVwsubVws ", subVws) } } } } } } } } } } // break } } } } // UIQueuingScrollView } } } //MARK: - TEXTVIEW DYNAMIC WIDTH CHANGE @objc func handleWidthTapVw(_ gestureRecognizer: UIPanGestureRecognizer) { let getSuperViewWidth : CGFloat = (gestureRecognizer.view?.superview?.frame.width)! print("brownTAp ", getSuperViewWidth) if gestureRecognizer.state == .began || gestureRecognizer.state == .changed { let velo = gestureRecognizer.velocity(in: gestureRecognizer.view) if getSuperViewWidth > 80 { if velo.x > 0 { print("Moving_rigtht") gestureRecognizer.view?.superview?.frame.size.width = (gestureRecognizer.view?.superview?.frame.size.width)! + 2 gestureRecognizer.view?.frame.origin.x = (gestureRecognizer.view?.superview?.frame.size.width)! - 20 } else { print("Moving_left") gestureRecognizer.view?.superview?.frame.size.width = (gestureRecognizer.view?.superview?.frame.size.width)! - 2 gestureRecognizer.view?.frame.origin.x = (gestureRecognizer.view?.superview?.frame.size.width)! - 20 } if (gestureRecognizer.view?.superview as! UITextView).contentSize.height > 80 { gestureRecognizer.view?.superview?.frame.size.height = (gestureRecognizer.view?.superview as! UITextView).contentSize.height } else { gestureRecognizer.view?.superview?.frame.size.height = 82 } } else { gestureRecognizer.view?.superview?.frame.size.width = 82 } } else if gestureRecognizer.state == .ended { print("\n\nHello World ", gestureRecognizer.view) usingWidthText = (gestureRecognizer.view?.superview?.frame.size.width)! usingHeightText = (gestureRecognizer.view?.superview?.frame.size.height)! print("usingWidthTxt ", usingWidthText) // MovingTextViewAnnotation(forWhich: "height") // MovingTextViewAnnotation(forWhich: "width") } } //MARK:- PREVIOUS DRAW FORM USERDEF func previousDrawAddedInPage() { if totalBezierPathDict.count > 0 { for (key, value) in totalBezierPathDict { let charset = CharacterSet(charactersIn: "fileNumber\(pdfClickedRow)") if key.rangeOfCharacter(from: charset) != nil { let gettPageNum = Int(key.components(separatedBy: "PageNumber")[1]) for path in value { print("Pathqwe1234234234") BezierPathAddArr.append(path) } print("keykey ", key) print("Qwerqeqeqewqqweqe ", BezierPathAddArr) if BezierPathAddArr.count > 0 { for i in BezierPathAddArr { var createdDict = [String : Any]() createdDict = i let pointsArr : [CGPoint] = createdDict["BezierPathPoints"] as! [CGPoint] let pathColr : UIColor = createdDict["BezierPathColor"] as! UIColor print("qwe1234234234") let pageBounds = pdfView.currentPage?.bounds(for: .mediaBox) let b = PDFBorder() b.lineWidth = 10.0 let inkAnnotation = PDFAnnotation(bounds: pageBounds!, forType: PDFAnnotationSubtype.ink, withProperties: nil) var retrivePdfBezierPath = UIBezierPath() for points in 0..<pointsarr.count { if (points % 2) != 0 { retrivePdfBezierPath.addLine(to: pointsArr[points] ) } else { retrivePdfBezierPath.move(to: pointsArr[points]) } } print("added1234234234 ", retrivePdfBezierPath) inkAnnotation.add(retrivePdfBezierPath) inkAnnotation.border = b inkAnnotation.color = pathColr //colorForeground.withAlphaComponent(0.0) pdfView.document?.page(at: gettPageNum!)?.addAnnotation(inkAnnotation) print("1234234234") } BezierPathAddArr.removeAll() } } } } } //MARK:- TXTVW PAN GESTURE @objc func handleTap(_ gestureRecognizer: UIPanGestureRecognizer) { if gestureRecognizer.state == .began || gestureRecognizer.state == .changed { let translation = gestureRecognizer.translation(in: gestureRecognizer.view) gestureRecognizer.view!.center = CGPoint(x: gestureRecognizer.view!.center.x + translation.x, y: gestureRecognizer.view!.center.y + translation.y) gestureRecognizer.setTranslation(CGPoint.zero, in: gestureRecognizer.view) } else { print("\n\nHello World ", gestureRecognizer.view) let position = CGPoint(x: (gestureRecognizer.view?.frame.origin.x)!, y: (gestureRecognizer.view?.frame.origin.y)!) guard let page = pdfView.page(for: position, nearest: true) else { return } let rect = pdfView.currentPage?.bounds(for: .mediaBox) let locationOnPage = pdfView.convert(position, to: page) textVwMovedX = (gestureRecognizer.view?.frame.origin.x)! textVwMovedY = (rect?.height)! - (gestureRecognizer.view?.frame.origin.y)!// locationOnPage.y MovingTextViewAnnotation(forWhich: "fingerPan") print("locationOnPage World ", locationOnPage) } } //MARK:- TOOL BAR func setDoneOnKeyboard(myTextView: UITextView, showButImg: UIImage, bgImg: UIImage, kboardIcon: UIImage, logic: String) { let keyboardToolbar = UIToolbar() keyboardToolbar.sizeToFit() let flexBarButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) //textbgcolor let show = UIBarButtonItem(image: showButImg, style: UIBarButtonItemStyle.plain, target: self, action: #selector(dismissKeyboard)) let background = UIBarButtonItem(image: bgImg, style: UIBarButtonItemStyle.plain, target: self, action: #selector(dismissKeyboard)) let kboard = UIBarButtonItem(image: kboardIcon, style: UIBarButtonItemStyle.plain, target: self, action: #selector(dismissKeyboard)) // let show = UIBarButtonItem(title: showButTitle, style: UIBarButtonItemStyle.plain, target: self, action: #selector(dismissKeyboard)) // keyboardToolbar.backgroundColor = UIColor.red let doneBarButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(dismissKeyboard)) if logic == "first" { keyboardToolbar.items = [show,background,flexBarButton,doneBarButton] } if logic == "textchange" || logic == "bgchange" { keyboardToolbar.items = [show,background,flexBarButton,kboard] } myTextView.inputAccessoryView = keyboardToolbar } @objc func dismissKeyboard(sender: UIBarButtonItem) { if sender.image == UIImage(named: "editing") { // print("new_button_add") // sender.title = "hide" hasKeyboardChanged = true whichPickerView = "fontchange" fontChangePickerView.reloadAllComponents() fontChangePickerView.selectRow(selectedRowFont, inComponent: 0, animated: true) fontChangePickerView.selectRow(selectedRowSize, inComponent: 1, animated: true) fontChangePickerView.selectRow(selectedRowColor, inComponent: 2, animated: true) switch (deviceIdiom) { case .pad: print("iPad style UI") showPickerPop(sender: sender) case .phone: print("iPhone and iPod touch style UI") getPDFFrame(todo: "showPickerView") default: print("Unspecified UI idiom") } } else if sender.image == UIImage(named: "textbgcolor") { whichPickerView = "bgchange" hasKeyboardChanged = true fontChangePickerView.reloadAllComponents() fontChangePickerView.selectRow(selectedBGRowColor, inComponent: 0, animated: true) fontChangePickerView.selectRow(selectedBGAlpha, inComponent: 1, animated: true) switch (deviceIdiom) { case .pad: print("iPad style UI") showPickerPop(sender: sender) case .phone: print("iPhone and iPod touch style UI") getPDFFrame(todo: "showPickerView") default: print("Unspecified UI idiom") } } else if sender.image == UIImage(named: "keyboard") { // print("hidePressed_button_add") // sender.title = "show" hasKeyboardChanged = true getPDFFrame(todo: "hidePickerView") colorForeground = usingFontColor MovingTextViewAnnotation(forWhich: "color") MovingTextViewAnnotation(forWhich: "font") MovingTextViewAnnotation(forWhich: "BGColor") } else { print("selPer ", self.presentingViewController?.popoverPresentationController) isDoneButtonPressed = true getPDFFrame(todo: "removeArrowSuviews") switch (deviceIdiom) { case .pad: colorForeground = usingFontColor MovingTextViewAnnotation(forWhich: "color") MovingTextViewAnnotation(forWhich: "font") MovingTextViewAnnotation(forWhich: "BGColor") case .phone: print("iPhonekb and iPod touch style UI") MovingTextViewAnnotation(forWhich: "height") MovingTextViewAnnotation(forWhich: "width") MovingTextViewAnnotation(forWhich: "fingerPan") colorForeground = usingFontColor MovingTextViewAnnotation(forWhich: "color") MovingTextViewAnnotation(forWhich: "font") MovingTextViewAnnotation(forWhich: "BGColor") default: print("Unspecified UI idiom") } hasKeyboardChanged = false // print("new_button_add") view.endEditing(true) } } func hidePopOver(sender: UIBarButtonItem) { let popoverContent = self.storyboard?.instantiateViewController(withIdentifier: "poppicker") as! PickerPopViewController popoverContent.modalPresentationStyle = .popover popoverContent.preferredContentSize = CGSize(width:300,height:200) popoverContent.popoverPresentationController!.delegate = self popoverContent.popoverPresentationController!.barButtonItem = sender popoverContent.dismiss(animated: false, completion: nil) } func showPickerPop(sender: UIBarButtonItem) { if let presented = self.popoverPresentationController { print("pres") } else{ print("no_pres") } let popoverContent = self.storyboard?.instantiateViewController(withIdentifier: "poppicker") as! PickerPopViewController popoverContent.modalPresentationStyle = .popover popoverContent.preferredContentSize = CGSize(width:300,height:200) popoverContent.popoverPresentationController!.delegate = self popoverContent.popoverPresentationController!.barButtonItem = sender popoverContent.popoverPresentationController?.backgroundColor = UIColor.orange popoverContent.chooseColrDel = self popoverContent.selectedBGRowColor = selectedBGRowColor popoverContent.selectedBGAlpha = selectedBGAlpha popoverContent.usingBGFontColor = usingBGFontColor popoverContent.usingBGFontAlpha = usingBGFontAlpha popoverContent.usingFontName = usingFontName popoverContent.usingFontSize = usingFontSize popoverContent.usingFontColor = usingFontColor popoverContent.selectedRowFont = selectedRowFont popoverContent.selectedRowSize = selectedRowSize popoverContent.selectedRowColor = selectedRowColor popoverContent.whichPickerView = whichPickerView self.present(popoverContent, animated: true, completion: nil) print("shPiPop") } func chooseColor(f_name: String, f_size: Int, f_color: UIColor, bg_color: UIColor, bg_alpha: CGFloat, f_name_sel: Int, f_size_sel: Int, f_color_sel: Int, bg_color_sel: Int, bg_alpha_sel: Int) { usingFontName = f_name usingFontSize = f_size usingFontColor = f_color usingBGFontAlpha = bg_alpha usingBGFontColor = bg_color selectedRowColor = f_color_sel selectedRowSize = f_size_sel selectedRowFont = f_name_sel selectedBGAlpha = bg_alpha_sel selectedBGRowColor = bg_color_sel getPDFFrame(todo: "default") } //MARK:- TEXTVIEW DELEGATE func textViewShouldBeginEditing(_ textView: UITextView) -> Bool { print("dsfdsf") return true } func textViewDidBeginEditing(_ textView: UITextView) { } func textViewDidChange(_ textView: UITextView) { print("changin ") print("C_Sz_Del ", textView.contentSize) print("C_Off_Del ", textView.contentOffset) if textView.contentSize.height >= usingHeightText { isTypeTextVwChanged = false for subVws in textView.subviews { textView.frame.size.height = textView.contentSize.height if subVws.tag == 444 { subVws.frame.origin.y = textView.contentSize.height - 20 // heightYOrgin = subVws.frame.origin.y } if subVws.tag == 333 { // subVws.frame.origin.y = textView.contentOffset.y //- 30 } } } else { print("Logic_less_than_height ", usingHeightText) } } //MARK:- PICKERVIEW DELEGATE func numberOfComponents(in pickerView: UIPickerView) -> Int { if whichPickerView == "fontchange" { return 3 } else if whichPickerView == "bgchange" { return 2 } else { return 0 } } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { if whichPickerView == "fontchange" { if component == 0 { return fontFamilyName.count } else if component == 1 { return fontSizeList.count } else { return fontColorList.count } } else if whichPickerView == "bgchange" { if component == 0 { return fontColorList.count } else { return bgOpacityList.count } } else { return 0 } } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if whichPickerView == "fontchange" { if component == 0 { selectedRowFont = row usingFontName = fontFamilyName[row]! fontNameLbl.text = " - " + String(usingFontSize) + " - " + usingFontName } if component == 1 { selectedRowSize = row usingFontSize = Int(fontSizeList[row]!) fontNameLbl.text = " - " + String(usingFontSize) + " - " + usingFontName } if component == 2 { selectedRowColor = row usingFontColor = fontColorList[row]! fontClrVw.backgroundColor = usingFontColor } fontNameLbl.font = UIFont(name: usingFontName, size: 14) } else if whichPickerView == "bgchange" { if component == 0 { selectedBGRowColor = row usingBGFontColor = fontColorList[row]! fontChangePickerView.reloadComponent(1) } if component == 1 { selectedBGAlpha = row usingBGFontAlpha = bgOpacityList[row]! print("two_options") } } else { } } func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { fontChangePickerView.backgroundColor = UIColor(red: 40/255, green: 40/255, blue: 40/255, alpha: 1.0) if whichPickerView == "fontchange" { var label = UILabel() if let v = view { label = v as! UILabel } if component == 0 { label.font = UIFont (name: fontFamilyName[row]!, size: 15) label.text = fontFamilyName[row] label.textAlignment = .center label.textColor = .white return label } else if component == 1 { label.font = UIFont (name: "Helvetica Neue", size: 12) let fontSize : Int = Int(fontSizeList[row]!) label.text = String(fontSize) label.textAlignment = .right label.textColor = .white return label } else { var colorView = UIView() if let v = view { colorView = v } print("colorViewcolorView ", view) let colorSubView = UIView(frame: CGRect(x: 40, y: (colorView.frame.midY + 3), width: 20, height: 20)) colorSubView.layer.cornerRadius = 10 colorSubView.backgroundColor = fontColorList[row] colorSubView.layer.borderWidth = 1.0 colorSubView.layer.borderColor = UIColor(red: 250/255, green: 250/255, blue: 250/255, alpha: 0.3).cgColor colorView.addSubview(colorSubView) return colorView } } else if whichPickerView == "bgchange" { var label = UILabel() if let v = view { label = v as! UILabel } var colorView = UIView() if let v = view { colorView = v } if component == 0 { let colorSubView = UIView(frame: CGRect(x: (((self.view.frame.width) / 4) - 15), y: (colorView.frame.midY + 3), width: 30, height: 20)) colorSubView.layer.cornerRadius = 5 colorSubView.backgroundColor = fontColorList[row] colorSubView.layer.borderWidth = 1.0 colorSubView.layer.borderColor = UIColor(red: 250/255, green: 250/255, blue: 250/255, alpha: 0.3).cgColor colorView.addSubview(colorSubView) return colorView } else { let colorSubView = UIView(frame: CGRect(x: (((self.view.frame.width) / 4) - 15), y: (colorView.frame.midY + 3), width: 30, height: 20)) colorSubView.layer.cornerRadius = 5 colorSubView.backgroundColor = usingBGFontColor.withAlphaComponent(bgOpacityList[row]!) colorSubView.layer.borderWidth = 1.0 colorSubView.layer.borderColor = UIColor(red: 250/255, green: 250/255, blue: 250/255, alpha: 0.3).cgColor colorView.addSubview(colorSubView) return colorView } } else { let vw = UIView() return vw } } func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat { if whichPickerView == "fontchange" { let componentTwoWidth : CGFloat = 50.0 //self.view.frame.width let componentThreeWidth : CGFloat = componentTwoWidth + 50 let componentOneWidth : CGFloat = self.view.frame.width - componentThreeWidth - componentTwoWidth if component == 0 { return componentOneWidth } else if component == 1 { return componentTwoWidth } else { return componentThreeWidth } } else if whichPickerView == "bgchange" { if component == 0 { return (self.view.frame.width) / 2 } else { return (self.view.frame.width) / 2 } } else { return 0 } } @IBAction func fontSetToolBarBtnAcn(_ sender: UIButton) { colorForeground = usingFontColor // getPDFFrame() MovingTextViewAnnotation(forWhich: "color") MovingTextViewAnnotation(forWhich: "font") // FontToolBarVw.isHidden = true // addWindow?.isHidden = true // addWindow.resignKey() for vw in (addWindow?.subviews)! { print("\n\nvwwww ",vw) if vw.tag == 900 { vw.backgroundColor = UIColor.yellow vw.alpha = 0.0 vw.removeFromSuperview() // vw.alpha = 0.0 // vw = UIView() } else { // addWindow?.insertSubview(vw, belowSubview: newVw) } } } override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { print("actionaction ", action) print("whichTaskPerf ", whichTask) if whichTask == "text" { if action == #selector(BookViewController.highlightTextColor) { return true } else { print("wrkin_cpy_not_come") return false } } else if whichTask == "goingToEdit" { if action == #selector(BookViewController.highlightTextColor) { return true } else { return false } } if whichTask == "highLightText" { if action == #selector(BookViewController.spacingRed) { return true } if action == #selector(BookViewController.spacingCyan) { return true } if action == #selector(BookViewController.spacingYellow) { return true } if action == #selector(BookViewController.spacingOrange) { return true } if action == #selector(BookViewController.spacingPurple) { return true } else { return false } } return false } //MARK:- CONVERT PDF TO IMAGE TO PAGE AND PDF func drawPDFfromURL(url: NSURL) { var pdfDoc: CGPDFDocument! pdfDoc = CGPDFDocument(url) let numberOfPages = pdfDoc.numberOfPages print("numberOfPagesnumberOfPages ", numberOfPages) for ii in 1...numberOfPages { let document = CGPDFDocument(url) let page = document?.page(at: ii) let pageRect = page!.getBoxRect(CGPDFBox.mediaBox) UIGraphicsBeginImageContextWithOptions(pageRect.size, true, 0) let context = UIGraphicsGetCurrentContext() context!.setFillColor(UIColor.white.cgColor) context!.fill(pageRect) context!.translateBy(x: 0.0, y: pageRect.size.height) context!.scaleBy(x: 1.0, y: -1.0) context!.drawPDFPage(page!) let img = UIGraphicsGetImageFromCurrentImageContext() pdfPagesImgArr.append(img!) UIGraphicsEndImageContext() } } func ConvertImagesToPages() { var pageNum : Int = 0 for img in pdfPagesImgArr { let currPage = PDFPage(image: img) pdfDocument?.insert(currPage!, at: pageNum) pageNum = pageNum + 1 } } } extension CGPath { func forEach( body: @escaping @convention(block) (CGPathElement) -> Void) { typealias Body = @convention(block) (CGPathElement) -> Void let callback: @convention(c) (UnsafeMutableRawPointer, UnsafePointer) -> Void = { (info, element) in let body = unsafeBitCast(info, to: Body.self) body(element.pointee) } print(MemoryLayout.size(ofValue: body)) let unsafeBody = unsafeBitCast(body, to: UnsafeMutableRawPointer.self) self.apply(info: unsafeBody, function: unsafeBitCast(callback, to: CGPathApplierFunction.self)) } func getPathElementsPoints() -> [CGPoint] { var arrayPoints : [CGPoint]! = [CGPoint]() self.forEach { element in switch (element.type) { case .moveToPoint: arrayPoints.append(element.points[0]) case .addLineToPoint: arrayPoints.append(element.points[0]) default: break } } return arrayPoints } func getPathElementsPointsAndTypes() -> ([CGPoint],[CGPathElementType]) { var arrayPoints : [CGPoint]! = [CGPoint]() var arrayTypes : [CGPathElementType]! = [CGPathElementType]() self.forEach { element in switch (element.type) { case .addLineToPoint: arrayPoints.append(element.points[0]) arrayTypes.append(element.type) default: break } } return (arrayPoints,arrayTypes) } } class PDFViewGestureRecognizer: UIGestureRecognizer { var isTracking = false override func touchesBegan(_ touches: Set, with event: UIEvent) { isTracking = true } override func touchesEnded(_ touches: Set, with event: UIEvent) { isTracking = false } override func touchesCancelled(_ touches: Set, with event: UIEvent) { isTracking = false } } extension URL { var typeIdentifier: String? { return (try? resourceValues(forKeys: [.typeIdentifierKey]))?.typeIdentifier } var localizedName: String? { return (try? resourceValues(forKeys: [.localizedNameKey]))?.localizedName } } extension UIColor { var name: String? { switch self { case UIColor.black: return "black" case UIColor.darkGray: return "darkGray" case UIColor.lightGray: return "lightGray" case UIColor.white: return "white" case UIColor.gray: return "gray" case UIColor.red: return "red" case UIColor.green: return "green" case UIColor.blue: return "blue" case UIColor.cyan: return "cyan" case UIColor.yellow: return "yellow" case UIColor.magenta: return "magenta" case UIColor.orange: return "orange" case UIColor.purple: return "purple" case UIColor.brown: return "brown" default: return nil } } } extension BookViewController: UIDocumentInteractionControllerDelegate { func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController { return self } func documentInteractionController(_ controller: UIDocumentInteractionController, willBeginSendingToApplication application: String?) { print("will begin") } func documentInteractionController(_ controller: UIDocumentInteractionController, didEndSendingToApplication application: String?) { print("did end") } }