How to get UIMenuController work for a custom view?

前端 未结 9 1229
旧时难觅i
旧时难觅i 2020-12-02 10:56

I\'m trying to get the following code work:

UIMenuController * menu = [UIMenuController sharedMenuController];
[menu setTargetRect: CGRectMake(100, 100, 100,         


        
9条回答
  •  日久生厌
    2020-12-02 11:26

    I did it in the following way below. Just call the method that shows the menu after very short delay in init. I didn't want to call it from View Controller and also didn't find an event that indicates that my custom view appeared and i'm ready to show menu. So this way OK from my perspective. Delay can be less, but its up to you.

    @implementation DTSignatureImageView
    
    - (id)initWithImage:(UIImage *)image
    {
        self = [super initWithImage:image];
        if(self){
            self.contentMode = UIViewContentModeScaleAspectFit;
            self.frame = CGRectMake(0, 0, image.size.width / 2.5, image.size.height / 2.5);
            self.userInteractionEnabled = YES;
    
            UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(signatureDidPan:)];
            [self addGestureRecognizer:pan];
    
            [self becomeFirstResponder];
    
            [self performSelector:@selector(showMenu) withObject:nil afterDelay:0.5];
        }
    
        return self;
    }
    
    - (BOOL)canBecomeFirstResponder
    {
        return YES;
    }
    
    - (void)showMenu
    {
        UIMenuController *menu = [UIMenuController sharedMenuController];
        menu.menuItems = @[
           [[UIMenuItem alloc] initWithTitle:@"Apply" action:@selector(applySignature)],
           [[UIMenuItem alloc] initWithTitle:@"Update" action:@selector(updateSignature)],
           [[UIMenuItem alloc] initWithTitle:@"Clear" action:@selector(delegateSignature)]];
        [menu setTargetRect:self.bounds inView:self];
        [menu setMenuVisible:YES animated:YES];
    }
    
    - (NSArray *)menuActions
    {
        static NSArray *actions = nil;
        if (actions == nil){
            actions = @[
                        NSStringFromSelector(@selector(applySignature)),
                        NSStringFromSelector(@selector(updateSignature)),
                        NSStringFromSelector(@selector(delegateSignature))];
        }
    
        return actions;
    }
    
    - (void) signatureDidPan: (UIPanGestureRecognizer *)gesture
    {
        switch (gesture.state) {
            case UIGestureRecognizerStateBegan: {
                [[UIMenuController sharedMenuController] setMenuVisible:NO animated:YES];
                break;
            }
    
            case UIGestureRecognizerStateEnded: {
                [self becomeFirstResponder];
                [self showMenu];
            }
    
            default:
                break;
        }
    
        CGPoint point = [gesture locationInView:gesture.view.superview];
        gesture.view.center = point;
    }
    

提交回复
热议问题