QuickLook

RSS for tag

Create previews of files to use inside your app or perform simple edits on previews using QuickLook.

Posts under QuickLook tag

148 Posts

Post

Replies

Boosts

Views

Activity

AR Quick View's AR Quick View button cannot be pressed on some iOS devices.
AR Quick View's AR Quick View button cannot be pressed on some iOS devices. As for the iPhone 12 Pro, the AR Quick View button cannot be pressed on iOS 15 when reading from the standard iOS QR code reader, but the AR Quick View button can be pressed on the iPhone 12 Pro with iOS 14. On other devices, you can press the AR Quick View button when launching from Safari, but you cannot press the AR Quick View button when accessing from the standard QR code reader. Also, on some iOS devices, the AR Quick View button cannot be pressed. The problem seems to be occurring outside of the https://konabeer.jp/beach-diorama-ar/ as well. Is there any way to avoid this AR Quick View button not being able to be pressed? It would be very helpful if I could get more information than just the solution to this problem. iPhone7(iOS13):OK iPhoneX(iOS15):QR Code Reader:NG iPhone11(iOS14):OK iPhone12Pro(iOS14):OK iPhone12Pro(iOS15):QR Code Reader:NG iPhone12(iOS15.1):QR Code Reader:NG iPad Air(iOS15):QR Code Reader:NG iPhoneSE(iOS15):QR Code Reader:NG As a result of our own verification, the AR Quick Look button is deactivated on iOS 15 and when the QR code is imported from the Control Center. If you know of any known bugs or workarounds, or if there are any informative sites that have information on this issue, I would appreciate it.
7
0
4.2k
Jan ’22
Does drawViewHierarchyInRect work with QLPreviewController?
I'm seeing an issue using [UIView drawViewHierarchyInRect:afterScreenUpdates:] to take an app "screenshot". Specifically, I'm seeing that a PDF rendered using QLPreviewController doesn't render in the screenshot when the code is run on a device. I'm using this UIView API in conjunction with UIGraphicsBeginImageContextWithOptions and UIGraphicsEndImageContext - the simplified code is as follows: UIWindow *appWindow = [[[UIApplication sharedApplication] delegate] window]; UIGraphicsBeginImageContextWithOptions(imageSize, NO, 1.0); CGContextRef graphicsContext = UIGraphicsGetCurrentContext(); BOOL result = [appWindow drawViewHierarchyInRect:screenBounds afterScreenUpdates:NO]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); and I'm setting up my QLPreviewController as follows: - (void)pdfButtonTapped:(nonnull UIButton *)button { QLPreviewController *nextViewController = [QLPreviewController new]; nextViewController.dataSource = self; [self presentViewController:nextViewController animated:YES completion:nil]; } #pragma mark - QLPreviewControllerDataSource - (NSInteger)numberOfPreviewItemsInPreviewController:(nonnull QLPreviewController *)controller { return 1; } - (nonnull id<QLPreviewItem>)previewController:(nonnull QLPreviewController *)controller previewItemAtIndex:(NSInteger)index { return [NSBundle.mainBundle URLForResource:@"menu_web_november" withExtension:@"pdf"]; } I'm running this code on both device and simulator: Device: iPad (6th generation), iOS 15.2 [Screen 1024x768] Simulator: iPad (9th generation), iOS 15.2, Xcode 13.2.1 (13C100) [Screen 1080x810] The results I'm seeing differ between simulator and device. On device, I see that only the navigation bar is rendered into the final image: On simulator, I see that the full view (including the PDF) is rendered into the final image: On both device and simulator, the result returned from the [UIView drawViewHierarchyInRect:afterScreenUpdates:] call is YES. I'm capturing these screenshots by setting a breakpoint in the code after UIGraphicsEndImageContext(), choosing the image variable in the debug inspector and pressing the "eye" button but note that these are the results I see when running the code in release too. I have a couple of questions about these results: Is it expected that QLPreviewController contents (for PDF at least) don't render in the snaphot image on device Is it expected that QLPreviewController contents (for PDF at least) do render in the snaphot image on simulator If this behaviour is expected, is there a way of telling which UIView subclasses are "compatible" with the [UIView drawViewHierarchyInRect:afterScreenUpdates:] API and which UIView subclasses won't render their contents in a snapshot? Thanks for your help in advance, Ceri
2
0
1.4k
Jan ’22
How to view the image(cv::mat) in the debug mode in xcode
Recently, I am learning some knowledge about OpenCV on Mac, refer to the online tutorial to configure OpenCV of C++ on Xcode, and implement some simple examples on Xcode. The biggest problem encountered is how to preview the image in debug mode. The cv::Mat image cannot be previewed directly, which is very unfriendly for debugging. I also found some solutions to this problem on the Internet, and these results are disappointing, at least for me as a programming beginner. I hope that this function implemented by xcode has the corresponding "OpenCV Image Viewer" plug-in on other IDEs on Mac such as Pycharm and CLion, and the "Image Watch" plug-in corresponding to Visual Studio on Windows. For me, this feature is necessary. According to this idea, is it a wrong choice to learn OpenCV C++ with Xcode, and embracing CLion on a Mac is the best choice for me? (Considering that Xcode is an IDE for Swift, I don't know much about Swift.) The process of implementing these simple examples on Xcode is still very enjoyable. I like Xcode's UI design. Therefore, I still hope that there is the best way to solve this problem in Xcode. The following is an example of running C++ OpenCV on Xcode: Xcode Version: 13.2.1 (13C100) OpenCV Version: stable 4.5.3 (bottled)
0
0
1.9k
Jan ’22
UIKeyCommand in QLPreviewController in iOS 15
With iOS 15 there are changes to keyboard handling. Besides usual overriding of keyCommands a programmer has to assign own commands higher priority than system commands. So, the following code works for me: final class MyViewController: UIViewController { override var keyCommands: [UIKeyCommand]? { let action = UIKeyCommand(input: UIKeyCommand.inputUpArrow, modifierFlags: [], action: #selector(myAction)) if #available(iOS 15, *) { action.wantsPriorityOverSystemBehavior = true } return [action] } // rest of the code } On the other hand, almost the same code but with inheriting from QLPreviewController doesn't work: final class PreviewViewController: QLPreviewController { // same internals as above } In view hierarchy I spotted that there is actually some kind of extra navigation, maybe that is stealing my keyboard presses, maybe that's why above code isn't working. Does anyone have an idea how to fix or workaround this issue? Obviously, the extra navigation is from Apple and I don't have access to these extra presented controllers. I was trying to print the following details, but neither helps: print(presentedViewController ?? "none") // output: none print(topMostViewController) // output: <MyApp.PreviewViewController: 0x7fbe44156203> print(inputViewController ?? "none") // output: none It's worth to add I've also tried to add method override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) { print("test?") super.pressesBegan(presses, with: event) } And test never appears in the console, whatever button I press. So clearly something else steals the key presses. This did not happen before iOS 15. I conclude it, thinking it may be a bug in the API. Probably just no one thought of this scenario when adding the new keys..?
0
0
832
Dec ’21
QuickLook Preview saving errors or no saving
Hi together, I am developing a document viewer for a specific API. I download the relevant files to a custom directory and open them using a QLPreviewController in SwiftUI. I built this with a UIViewControllerRepresentable. Everything is working fine except the saving of modified files using the pencil markup in the preview. Here is the error: https://pastebin.com/TRnfduE5 This is how my controller looks like: struct PreviewController: UIViewControllerRepresentable {     let url: URL     @Binding var isPresented: Bool          func makeUIViewController(context: Context) -> UINavigationController {         let controller = QLPreviewController()         controller.dataSource = context.coordinator         controller.navigationItem.leftBarButtonItem = UIBarButtonItem(                     barButtonSystemItem: .done, target: context.coordinator,                     action: #selector(context.coordinator.dismiss)                 )                  let navigationController = UINavigationController(rootViewController: controller)         return navigationController     }          func makeCoordinator() -> Coordinator {         return Coordinator(parent: self)     }          func updateUIViewController(_ uiViewController: UINavigationController, context: Context) {             let controller = QLPreviewController()             controller.dataSource = context.coordinator         }          class Coordinator: QLPreviewControllerDataSource {                  let parent: PreviewController                  init(parent: PreviewController) {             self.parent = parent         }                  @objc func dismiss() {             parent.isPresented = false         }                  func numberOfPreviewItems(             in controller: QLPreviewController         ) -> Int {             return 1         }                  func previewController(             _ controller: QLPreviewController, previewItemAt index: Int         ) -> QLPreviewItem {             return parent.url as QLPreviewItem         }                  func previewController(_ controller: QLPreviewController, editingModeFor previewItem: QLPreviewItem         ) -> QLPreviewItemEditingMode {             .createCopy         }                  func previewController(_: QLPreviewController, didUpdateContentsOf: QLPreviewItem){             print("Updated.")         }                  func previewController(_: QLPreviewController, didSaveEditedCopyOf: QLPreviewItem, at: URL) {             print("Saved: " + at.path)         }              } } Does anyone know, what the problem is here? And I made another experience: as you see there, I'm currently only logging the output / actions - and there isn't anything being logged, if I made just one edit. It only throws the error above after the 1st edit - so if I edit sth again and tap done or the pencil icon again... Is this ok so? Thanks for any help or advise!
2
0
2.1k
Nov ’21
QuickLook Extension and App Groups on macOS
Hello, I am trying to use app groups to share preferences between an app and its QuickLook extension (both sandboxed), but I can't understand why it's not working. For testing, I created an empty macOS app project and added a QuickLook Extension, then on both the targets' entitlement files I added the app group domain in the form "teamid.test". Last but not least, in the Info.plist file of the QL extension i added some UTIs to have the QL extension called when previewing. In the QL extension's PreviewViewController.swift file I try to save a value like this: func preparePreviewOfFile(at url: URL, completionHandler handler: @escaping (Error?) -> Void) { let defaults=UserDefaults(suiteName: "teamid.***") defaults?.set(1, forKey: "test") handler(nil) } If I try to run the app and preview a file though, I get this message in the Console: Couldn't write values for keys ( test ) in CFPrefsPlistSource<0x7fb63681cce0> (Domain: teamid.***, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: Yes): setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access And the value is not saved. The only way to make this work is to add a temporary exception in the extension target, like this: <array> <string>/Library/Group Containers/teamid.***/</string> </array> </plist> What bugs me is that if I try to save a value from the app instead, it works. Are app groups not supported for QuickLook extensions? Thank you, Michele
0
3
969
Nov ’21
Can I write to an App Group from an iOS Thumbnail Extension or QuickLook Extension?
Is it possible to write to an App Group's Container folder or UserDefaults from an iOS Thumbnail Extension or QuickLook Extension? It doesn't work. It does work for a Widget extension. I've added the App Group to the Entitlements of each extension. For writing a file to App Group Container I get Error Domain=NSCocoaErrorDomain Code=513 "Du hast nicht die Zugriffsrechte, um die Datei „quicklook 01 current.log“ im Ordner „DocumentInvestigation“ zu sichern." UserInfo={NSFilePath=/private/var/mobile/Containers/Shared/AppGroup/<redacted: the container UUID>/DocumentInvestigation/quicklook 01 current.log, NSUnderlyingError=0x28090bb10 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}} For setting App Group UserDefaults [User Defaults] Couldn't write values for keys ( &#9;&#9;example ) in CFPrefsPlistSource<0x2839cc700> (Domain: <redacted: the-group-identifier>, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No): setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access The use case is, that we are investigating an issue and would like to log to a file which we then can have customers send us.
3
0
2.1k
Nov ’21
AR Quick View's AR Quick View button cannot be pressed on some iOS devices.
AR Quick View's AR Quick View button cannot be pressed on some iOS devices. As for the iPhone 12 Pro, the AR Quick View button cannot be pressed on iOS 15 when reading from the standard iOS QR code reader, but the AR Quick View button can be pressed on the iPhone 12 Pro with iOS 14. On other devices, you can press the AR Quick View button when launching from Safari, but you cannot press the AR Quick View button when accessing from the standard QR code reader. Also, on some iOS devices, the AR Quick View button cannot be pressed. The problem seems to be occurring outside of the https://konabeer.jp/beach-diorama-ar/ as well. Is there any way to avoid this AR Quick View button not being able to be pressed? It would be very helpful if I could get more information than just the solution to this problem. iPhone7(iOS13):OK iPhoneX(iOS15):QR Code Reader:NG iPhone11(iOS14):OK iPhone12Pro(iOS14):OK iPhone12Pro(iOS15):QR Code Reader:NG iPhone12(iOS15.1):QR Code Reader:NG iPad Air(iOS15):QR Code Reader:NG iPhoneSE(iOS15):QR Code Reader:NG As a result of our own verification, the AR Quick Look button is deactivated on iOS 15 and when the QR code is imported from the Control Center. If you know of any known bugs or workarounds, or if there are any informative sites that have information on this issue, I would appreciate it.
Replies
7
Boosts
0
Views
4.2k
Activity
Jan ’22
Does drawViewHierarchyInRect work with QLPreviewController?
I'm seeing an issue using [UIView drawViewHierarchyInRect:afterScreenUpdates:] to take an app "screenshot". Specifically, I'm seeing that a PDF rendered using QLPreviewController doesn't render in the screenshot when the code is run on a device. I'm using this UIView API in conjunction with UIGraphicsBeginImageContextWithOptions and UIGraphicsEndImageContext - the simplified code is as follows: UIWindow *appWindow = [[[UIApplication sharedApplication] delegate] window]; UIGraphicsBeginImageContextWithOptions(imageSize, NO, 1.0); CGContextRef graphicsContext = UIGraphicsGetCurrentContext(); BOOL result = [appWindow drawViewHierarchyInRect:screenBounds afterScreenUpdates:NO]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); and I'm setting up my QLPreviewController as follows: - (void)pdfButtonTapped:(nonnull UIButton *)button { QLPreviewController *nextViewController = [QLPreviewController new]; nextViewController.dataSource = self; [self presentViewController:nextViewController animated:YES completion:nil]; } #pragma mark - QLPreviewControllerDataSource - (NSInteger)numberOfPreviewItemsInPreviewController:(nonnull QLPreviewController *)controller { return 1; } - (nonnull id<QLPreviewItem>)previewController:(nonnull QLPreviewController *)controller previewItemAtIndex:(NSInteger)index { return [NSBundle.mainBundle URLForResource:@"menu_web_november" withExtension:@"pdf"]; } I'm running this code on both device and simulator: Device: iPad (6th generation), iOS 15.2 [Screen 1024x768] Simulator: iPad (9th generation), iOS 15.2, Xcode 13.2.1 (13C100) [Screen 1080x810] The results I'm seeing differ between simulator and device. On device, I see that only the navigation bar is rendered into the final image: On simulator, I see that the full view (including the PDF) is rendered into the final image: On both device and simulator, the result returned from the [UIView drawViewHierarchyInRect:afterScreenUpdates:] call is YES. I'm capturing these screenshots by setting a breakpoint in the code after UIGraphicsEndImageContext(), choosing the image variable in the debug inspector and pressing the "eye" button but note that these are the results I see when running the code in release too. I have a couple of questions about these results: Is it expected that QLPreviewController contents (for PDF at least) don't render in the snaphot image on device Is it expected that QLPreviewController contents (for PDF at least) do render in the snaphot image on simulator If this behaviour is expected, is there a way of telling which UIView subclasses are "compatible" with the [UIView drawViewHierarchyInRect:afterScreenUpdates:] API and which UIView subclasses won't render their contents in a snapshot? Thanks for your help in advance, Ceri
Replies
2
Boosts
0
Views
1.4k
Activity
Jan ’22
How to view the image(cv::mat) in the debug mode in xcode
Recently, I am learning some knowledge about OpenCV on Mac, refer to the online tutorial to configure OpenCV of C++ on Xcode, and implement some simple examples on Xcode. The biggest problem encountered is how to preview the image in debug mode. The cv::Mat image cannot be previewed directly, which is very unfriendly for debugging. I also found some solutions to this problem on the Internet, and these results are disappointing, at least for me as a programming beginner. I hope that this function implemented by xcode has the corresponding "OpenCV Image Viewer" plug-in on other IDEs on Mac such as Pycharm and CLion, and the "Image Watch" plug-in corresponding to Visual Studio on Windows. For me, this feature is necessary. According to this idea, is it a wrong choice to learn OpenCV C++ with Xcode, and embracing CLion on a Mac is the best choice for me? (Considering that Xcode is an IDE for Swift, I don't know much about Swift.) The process of implementing these simple examples on Xcode is still very enjoyable. I like Xcode's UI design. Therefore, I still hope that there is the best way to solve this problem in Xcode. The following is an example of running C++ OpenCV on Xcode: Xcode Version: 13.2.1 (13C100) OpenCV Version: stable 4.5.3 (bottled)
Replies
0
Boosts
0
Views
1.9k
Activity
Jan ’22
UIKeyCommand in QLPreviewController in iOS 15
With iOS 15 there are changes to keyboard handling. Besides usual overriding of keyCommands a programmer has to assign own commands higher priority than system commands. So, the following code works for me: final class MyViewController: UIViewController { override var keyCommands: [UIKeyCommand]? { let action = UIKeyCommand(input: UIKeyCommand.inputUpArrow, modifierFlags: [], action: #selector(myAction)) if #available(iOS 15, *) { action.wantsPriorityOverSystemBehavior = true } return [action] } // rest of the code } On the other hand, almost the same code but with inheriting from QLPreviewController doesn't work: final class PreviewViewController: QLPreviewController { // same internals as above } In view hierarchy I spotted that there is actually some kind of extra navigation, maybe that is stealing my keyboard presses, maybe that's why above code isn't working. Does anyone have an idea how to fix or workaround this issue? Obviously, the extra navigation is from Apple and I don't have access to these extra presented controllers. I was trying to print the following details, but neither helps: print(presentedViewController ?? "none") // output: none print(topMostViewController) // output: <MyApp.PreviewViewController: 0x7fbe44156203> print(inputViewController ?? "none") // output: none It's worth to add I've also tried to add method override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) { print("test?") super.pressesBegan(presses, with: event) } And test never appears in the console, whatever button I press. So clearly something else steals the key presses. This did not happen before iOS 15. I conclude it, thinking it may be a bug in the API. Probably just no one thought of this scenario when adding the new keys..?
Replies
0
Boosts
0
Views
832
Activity
Dec ’21
QuickLook Preview saving errors or no saving
Hi together, I am developing a document viewer for a specific API. I download the relevant files to a custom directory and open them using a QLPreviewController in SwiftUI. I built this with a UIViewControllerRepresentable. Everything is working fine except the saving of modified files using the pencil markup in the preview. Here is the error: https://pastebin.com/TRnfduE5 This is how my controller looks like: struct PreviewController: UIViewControllerRepresentable {     let url: URL     @Binding var isPresented: Bool          func makeUIViewController(context: Context) -> UINavigationController {         let controller = QLPreviewController()         controller.dataSource = context.coordinator         controller.navigationItem.leftBarButtonItem = UIBarButtonItem(                     barButtonSystemItem: .done, target: context.coordinator,                     action: #selector(context.coordinator.dismiss)                 )                  let navigationController = UINavigationController(rootViewController: controller)         return navigationController     }          func makeCoordinator() -> Coordinator {         return Coordinator(parent: self)     }          func updateUIViewController(_ uiViewController: UINavigationController, context: Context) {             let controller = QLPreviewController()             controller.dataSource = context.coordinator         }          class Coordinator: QLPreviewControllerDataSource {                  let parent: PreviewController                  init(parent: PreviewController) {             self.parent = parent         }                  @objc func dismiss() {             parent.isPresented = false         }                  func numberOfPreviewItems(             in controller: QLPreviewController         ) -> Int {             return 1         }                  func previewController(             _ controller: QLPreviewController, previewItemAt index: Int         ) -> QLPreviewItem {             return parent.url as QLPreviewItem         }                  func previewController(_ controller: QLPreviewController, editingModeFor previewItem: QLPreviewItem         ) -> QLPreviewItemEditingMode {             .createCopy         }                  func previewController(_: QLPreviewController, didUpdateContentsOf: QLPreviewItem){             print("Updated.")         }                  func previewController(_: QLPreviewController, didSaveEditedCopyOf: QLPreviewItem, at: URL) {             print("Saved: " + at.path)         }              } } Does anyone know, what the problem is here? And I made another experience: as you see there, I'm currently only logging the output / actions - and there isn't anything being logged, if I made just one edit. It only throws the error above after the 1st edit - so if I edit sth again and tap done or the pencil icon again... Is this ok so? Thanks for any help or advise!
Replies
2
Boosts
0
Views
2.1k
Activity
Nov ’21
QuickLook Extension and App Groups on macOS
Hello, I am trying to use app groups to share preferences between an app and its QuickLook extension (both sandboxed), but I can't understand why it's not working. For testing, I created an empty macOS app project and added a QuickLook Extension, then on both the targets' entitlement files I added the app group domain in the form "teamid.test". Last but not least, in the Info.plist file of the QL extension i added some UTIs to have the QL extension called when previewing. In the QL extension's PreviewViewController.swift file I try to save a value like this: func preparePreviewOfFile(at url: URL, completionHandler handler: @escaping (Error?) -> Void) { let defaults=UserDefaults(suiteName: "teamid.***") defaults?.set(1, forKey: "test") handler(nil) } If I try to run the app and preview a file though, I get this message in the Console: Couldn't write values for keys ( test ) in CFPrefsPlistSource<0x7fb63681cce0> (Domain: teamid.***, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: Yes): setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access And the value is not saved. The only way to make this work is to add a temporary exception in the extension target, like this: <array> <string>/Library/Group Containers/teamid.***/</string> </array> </plist> What bugs me is that if I try to save a value from the app instead, it works. Are app groups not supported for QuickLook extensions? Thank you, Michele
Replies
0
Boosts
3
Views
969
Activity
Nov ’21
Can I write to an App Group from an iOS Thumbnail Extension or QuickLook Extension?
Is it possible to write to an App Group's Container folder or UserDefaults from an iOS Thumbnail Extension or QuickLook Extension? It doesn't work. It does work for a Widget extension. I've added the App Group to the Entitlements of each extension. For writing a file to App Group Container I get Error Domain=NSCocoaErrorDomain Code=513 "Du hast nicht die Zugriffsrechte, um die Datei „quicklook 01 current.log“ im Ordner „DocumentInvestigation“ zu sichern." UserInfo={NSFilePath=/private/var/mobile/Containers/Shared/AppGroup/<redacted: the container UUID>/DocumentInvestigation/quicklook 01 current.log, NSUnderlyingError=0x28090bb10 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}} For setting App Group UserDefaults [User Defaults] Couldn't write values for keys ( &#9;&#9;example ) in CFPrefsPlistSource<0x2839cc700> (Domain: <redacted: the-group-identifier>, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No): setting preferences outside an application's container requires user-preference-write or file-write-data sandbox access The use case is, that we are investigating an issue and would like to log to a file which we then can have customers send us.
Replies
3
Boosts
0
Views
2.1k
Activity
Nov ’21