I would like a “drawing popover” appearing by clicking in a tableviewcell?

我的梦境 提交于 2019-12-08 12:59:35

问题


I would like to have a popover with a signature "drawing" when I click in a tableviewcell. Like this picture :

So here is my code :

- (void)didSelectWithTableView:(UITableView *)tableView controller:(UIViewController *)controller
{
    red = 0.0/255.0;
    green = 0.0/255.0;
    blue = 0.0/255.0;
    brush = 2.0;
    opacity = 1.0;

    viewController = [[UIViewController alloc] init];

    mainImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, viewController.view.frame.size.width, viewController.view.frame.size.height)];
    mainImage.backgroundColor = [UIColor whiteColor];
    tempDrawImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, viewController.view.frame.size.width, viewController.view.frame.size.height)];
    tempDrawImage.backgroundColor = [UIColor whiteColor];
    [viewController.view addSubview:mainImage];
    [mainImage setContentMode:UIViewContentModeScaleToFill];
    [viewController.view addSubview:tempDrawImage];
    [tempDrawImage setContentMode:UIViewContentModeScaleToFill];

    UIButton *saveBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [saveBtn addTarget:self
                action:@selector(save)
      forControlEvents:UIControlEventTouchUpInside];
    [saveBtn setTitle:@"Save" forState:UIControlStateNormal];
    [saveBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    NSLog(@"frame : %@", viewController.view);
    saveBtn.frame = CGRectMake(viewController.view.frame.origin.x + 570, viewController.view.frame.origin.y + 20, 60.0, 80.0);
    [viewController.view addSubview:saveBtn];

    UIButton *cancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [cancelBtn addTarget:self
                  action:@selector(reset)
        forControlEvents:UIControlEventTouchUpInside];
    [cancelBtn setTitle:@"Reset" forState:UIControlStateNormal];
    [cancelBtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    NSLog(@"frame : %@", viewController.view);
    cancelBtn.frame = CGRectMake(viewController.view.frame.origin.x + 20, viewController.view.frame.origin.y + 20, 60.0, 80.0);
    [viewController.view addSubview:cancelBtn];

    SignaturePopover = [[UIPopoverController alloc] initWithContentViewController:viewController];
    SignaturePopover.delegate = self;
    SignaturePopover.popoverContentSize = CGSizeMake(644, 425); //your custom size.

    [SignaturePopover presentPopoverFromRect:self.contentView.frame inView:self.contentView permittedArrowDirections: UIPopoverArrowDirectionDown | UIPopoverArrowDirectionUp animated:YES];  
}

The problem is that when I click on the tableviewcell, this functions are well called in the TableViewCell, but they are not called when I click in the popover :

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];

    [self.nextResponder touchesBegan:touches withEvent:event];
    NSLog(@"viewController : %@", self.class);
    if (![self.class isSubclassOfClass: [FXFormSignatureCell class]])
    {
        mouseSwiped = NO;
        UITouch *touch = [touches anyObject];
        lastPoint = [touch locationInView:viewController.view];
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];

    [self.nextResponder touchesMoved:touches withEvent:event];
        mouseSwiped = YES;
        UITouch *touch = [touches anyObject];
        CGPoint currentPoint = [touch locationInView:viewController.view];

        UIGraphicsBeginImageContext(viewController.view.frame.size);
        [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, viewController.view.frame.size.width, viewController.view.frame.size.height)];
        CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
        CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
        CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
        CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush );
        CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0);
        CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal);

        CGContextStrokePath(UIGraphicsGetCurrentContext());
        self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
        [self.tempDrawImage setAlpha:opacity];
        UIGraphicsEndImageContext();

        lastPoint = currentPoint;
   // }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];

    [self.nextResponder touchesEnded:touches withEvent:event];
        if(!mouseSwiped)
        {
            UIGraphicsBeginImageContext(viewController.view.frame.size);
            [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, viewController.view.frame.size.width, viewController.view.frame.size.height)];
            CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
            CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush);
            CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, opacity);
            CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
            CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
            CGContextStrokePath(UIGraphicsGetCurrentContext());
            CGContextFlush(UIGraphicsGetCurrentContext());
            self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
        }

        UIGraphicsBeginImageContext(self.mainImage.frame.size);
        [self.mainImage.image drawInRect:CGRectMake(0, 0, viewController.view.frame.size.width, viewController.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0];
        [self.tempDrawImage.image drawInRect:CGRectMake(0, 0, viewController.view.frame.size.width, viewController.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:opacity];
        self.mainImage.image = UIGraphicsGetImageFromCurrentImageContext();
        self.tempDrawImage.image = nil;
        UIGraphicsEndImageContext();
        NSLog(@"mainimage : %@, tempimage : %@", mainImage, tempDrawImage);
}

Question : How can I have the touchesBegan, touchesMoved and touchesEnded called in the popover subView? Thanks in advance :D


回答1:


The touch methods are not called because the Popover is a separate view-controller. Your touchesBegan and related methods are in the wrong place.

To get everything working, just create a new UIViewController subclass, say SignatureViewController.

Then replace your first line:

viewController = [[UIViewController alloc] init];

to

viewController = [[SignatureViewController alloc] init];

And implement your touch methods within SignatureViewController.m



来源:https://stackoverflow.com/questions/36135820/i-would-like-a-drawing-popover-appearing-by-clicking-in-a-tableviewcell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!