How to implement 3D-Touch Peek-and-select?

后端 未结 3 1173
执念已碎
执念已碎 2020-12-30 11:10

Phone, Reminders, and Maps use a different 3D-Touch Peek UI allowing to select an action in one go. For instance, force-press on a reminder and select \"Remind me on a day\"

相关标签:
3条回答
  • 2020-12-30 11:24

    Those are UIPreviewActionItem.

    After overriding previewingContext:viewControllerForLocation: you can also override - (NSArray<id<UIPreviewActionItem>> *)previewActionItems and that will allow you to specify your quick actions.

    Here's a snippet that will help you out: (related tutorial)

    - (NSArray<id<UIPreviewActionItem>> *)previewActionItems
    {
        UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"Action 1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
            NSLog(@"Action 1 triggered");
        }];
    
        UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"Destructive Action" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
            NSLog(@"Destructive Action triggered");
        }];
    
        UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"Selected Action" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
            NSLog(@"Selected Action triggered");
        }];
    
        return @[action1, action2, action3];
    }
    

    Apple Docs:

    This property is for use with a preview (peek) view controller which you present in your implementation of the previewingContext:viewControllerForLocation: delegate method..

    Implement this method to provide quick actions for such a preview. When the user swipes upward on the preview, the system presents these quick action items in a sheet below the preview.

    The default implementation of this method returns an empty array.

    0 讨论(0)
  • 2020-12-30 11:30

    I asked my question on the Apple Developer Forums as well and received this reply from Apple:

    Currently there is not public API to do these things. Please file bug reports if this is something you want to do in your app, and include specific details of what you're looking to do.

    So it's currently not possible using the official SDK. I filed this enhancement request radar and I encourage you to dupe it if you need this, too!

    0 讨论(0)
  • 2020-12-30 11:43

    For future readers, the response from Apple for this question is:

    Currently there is not public API to do these things. Please file bug reports if this is something you want to do in your app, and include specific details of what you're looking to do.

    Source: Apple Developer Forum

    0 讨论(0)
提交回复
热议问题