Enable right-click context menus on iPadOS

This commit is contained in:
Cameron Gutman 2020-11-14 15:57:16 -06:00
parent dc9b5b7c96
commit 78f2b8ac47
4 changed files with 52 additions and 0 deletions

View File

@ -16,7 +16,11 @@
@end @end
#if !TARGET_OS_TV
@interface UIAppView : UIButton <UIContextMenuInteractionDelegate>
#else
@interface UIAppView : UIButton @interface UIAppView : UIButton
#endif
- (id) initWithApp:(TemporaryApp*)app cache:(NSCache*)cache andCallback:(id<AppCallback>)callback; - (id) initWithApp:(TemporaryApp*)app cache:(NSCache*)cache andCallback:(id<AppCallback>)callback;
- (void) updateAppImage; - (void) updateAppImage;

View File

@ -46,6 +46,13 @@ static UIImage* noImage;
[_appImage setImage:noImage]; [_appImage setImage:noImage];
[self addSubview:_appImage]; [self addSubview:_appImage];
#if !TARGET_OS_TV
if (@available(iOS 13.0, *)) {
UIContextMenuInteraction* rightClickInteraction = [[UIContextMenuInteraction alloc] initWithDelegate:self];
[self addInteraction:rightClickInteraction];
}
#endif
UILongPressGestureRecognizer* longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(appLongClicked:)]; UILongPressGestureRecognizer* longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(appLongClicked:)];
[self addGestureRecognizer:longPressRecognizer]; [self addGestureRecognizer:longPressRecognizer];
@ -79,11 +86,26 @@ static UIImage* noImage;
} }
- (void) appLongClicked:(UILongPressGestureRecognizer*)gesture { - (void) appLongClicked:(UILongPressGestureRecognizer*)gesture {
#if !TARGET_OS_TV
if (@available(iOS 13.0, *)) {
// contextMenuInteraction will handle this
return;
}
#endif
if (gesture.state == UIGestureRecognizerStateBegan) { if (gesture.state == UIGestureRecognizerStateBegan) {
[_callback appLongClicked:_app view:self]; [_callback appLongClicked:_app view:self];
} }
} }
#if !TARGET_OS_TV
- (UIContextMenuConfiguration *)contextMenuInteraction:(UIContextMenuInteraction *)interaction
configurationForMenuAtLocation:(CGPoint)location {
[_callback appLongClicked:_app view:self];
return nil;
}
#endif
- (void) updateAppImage { - (void) updateAppImage {
if (_appOverlay != nil) { if (_appOverlay != nil) {
[_appOverlay removeFromSuperview]; [_appOverlay removeFromSuperview];

View File

@ -17,7 +17,11 @@
@end @end
#if !TARGET_OS_TV
@interface UIComputerView : UIButton <UIContextMenuInteractionDelegate>
#else
@interface UIComputerView : UIButton @interface UIComputerView : UIButton
#endif
- (id) initWithComputer:(TemporaryHost*)host andCallback:(id<HostCallback>)callback; - (id) initWithComputer:(TemporaryHost*)host andCallback:(id<HostCallback>)callback;
- (id) initForAddWithCallback:(id<HostCallback>)callback; - (id) initForAddWithCallback:(id<HostCallback>)callback;

View File

@ -122,6 +122,13 @@ static const int LABEL_DY = 20;
UILongPressGestureRecognizer* longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(hostLongClicked:)]; UILongPressGestureRecognizer* longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(hostLongClicked:)];
[self addGestureRecognizer:longPressRecognizer]; [self addGestureRecognizer:longPressRecognizer];
#if !TARGET_OS_TV
if (@available(iOS 13.0, *)) {
UIContextMenuInteraction* rightClickInteraction = [[UIContextMenuInteraction alloc] initWithDelegate:self];
[self addInteraction:rightClickInteraction];
}
#endif
[self addTarget:self action:@selector(hostClicked) forControlEvents:UIControlEventPrimaryActionTriggered]; [self addTarget:self action:@selector(hostClicked) forControlEvents:UIControlEventPrimaryActionTriggered];
[self updateContentsForHost:host]; [self updateContentsForHost:host];
@ -194,11 +201,26 @@ static const int LABEL_DY = 20;
} }
- (void) hostLongClicked:(UILongPressGestureRecognizer*)gesture { - (void) hostLongClicked:(UILongPressGestureRecognizer*)gesture {
#if !TARGET_OS_TV
if (@available(iOS 13.0, *)) {
// contextMenuInteraction will handle this
return;
}
#endif
if (gesture.state == UIGestureRecognizerStateBegan) { if (gesture.state == UIGestureRecognizerStateBegan) {
[_callback hostLongClicked:_host view:self]; [_callback hostLongClicked:_host view:self];
} }
} }
#if !TARGET_OS_TV
- (UIContextMenuConfiguration *)contextMenuInteraction:(UIContextMenuInteraction *)interaction
configurationForMenuAtLocation:(CGPoint)location {
[_callback hostLongClicked:_host view:self];
return nil;
}
#endif
- (void) hostClicked { - (void) hostClicked {
[_callback hostClicked:_host view:self]; [_callback hostClicked:_host view:self];
} }