【问题标题】:Drag and drop without removing UIButton拖放而不删除 UIButton
【发布时间】:2011-09-07 13:24:30
【问题描述】:

我正在 iphone 应用程序中实现拖放系统。到目前为止,我设法实现了可拖动按钮,并且工作正常。这是我的代码:

首先,我将动作分配给按钮:

[button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside];

然后,我创建拖动:

- (IBAction) imageMoved:(id) sender withEvent:(UIEvent *) event
{
    NSLog(@"moved");
    CGPoint point = [[[event allTouches] anyObject] locationInView:self.view];
    UIControl *control = sender;
    control.center = point;
}

但是,我想要实现的是被拖动的按钮不会从它所在的位置移除。所以我想到了一个解决方案,即创建一个类似于第一个的新按钮并移动这个新创建的按钮。但是我在实施最后一部分时遇到了麻烦。 有什么帮助吗?非常感谢!

【问题讨论】:

    标签: objective-c ios drag-and-drop


    【解决方案1】:
    - (IBAction) imageMoved:(id) sender withEvent:(UIEvent *) event {
        NSLog(@"moved");          
    
        CGPoint point = [[[event allTouches] anyObject] locationInView:self.view];
    
        if (![self.view viewWithTag:11]) {
    
            NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:(UIButton*)sender];                
    
            UIButton *anotherButton =(UIButton*) [NSKeyedUnarchiver unarchiveObjectWithData:archivedData];
    
            anotherButton.tag = 11;    
    
    
            UIImage *senderImage=[(UIButton *)sender imageForState:UIControlStateNormal];
    
    
    
    
            CGImageRef cgImage = [senderImage CGImage];
    
    
            UIImage *copyOfImage = [[UIImage alloc] initWithCGImage:cgImage];
    
    
    
            [anotherButton setImage:copyOfImage forState:UIControlStateNormal];
    
            [self.view addSubview:anotherButton];
        }
    
        [self.view viewWithTag:11].center = point;
    }
    

    【讨论】:

    • 非常感谢您的回复。这似乎是我需要的,但不知何故它抛出异常:-[UIImage encodeWithCoder:]: unrecognized selector sent to instance 0x6323500 当它到达线路时:NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:sender];。你能看出是什么引发了异常吗?
    • 您要求移动 UIButton 但您已将其用于 uiimageview
    • 我再次更改了上面的代码,只需再次复制并粘贴并回复
    • 仍然抛出同样的异常。可能是因为我使用的是 UIButtonTypeCustom 吗? self.button = [UIButton buttonWithType:UIButtonTypeCustom];
    • 出于测试目的从按钮中删除图像并为按钮命名并运行并回复
    【解决方案2】:

    要取消限制,您可以在源按钮上添加两个事件,如下所示:

    [button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside];
    [button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragOutside];
    

    这样,当您退出当前视图(您的按钮)的边界时,该事件也会触发,您将能够将新按钮全部移动到超级视图周围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多