如何让 touchesMoved 只控制一个视图?

Posted

技术标签:

【中文标题】如何让 touchesMoved 只控制一个视图?【英文标题】:how to let the touchesMoved only control one view? 【发布时间】:2011-07-17 15:43:21 【问题描述】:

我在视图上创建了一个 UIButton,我想让 touchesMoved 只控制 UIButton,而不是整个视图

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
UITouch *touch = [touches anyObject];
CGPoint touchMoved = [touch locationInView:self.view];

我想这样做 如果我触摸 UIButton,然后 UIButton 可以用我的手指移动,如果我触摸其他视图并且我的手指在屏幕上移动,则 UIButton 什么也不做。 这意味着函数 touchesMoved 只有 UIButton 的作用,那我该怎么做呢?谢谢

【问题讨论】:

【参考方案1】:

我假设您显示的代码发生在您的自定义视图控制器子类中,UIButton 是其视图的子视图。

在您的班级中定义一个简单的BOOL,您首先将其设置为NO。然后在事件处理方法中更新。

// .h
BOOL buttonTouched;

// .m
// in the viewDidLoad
buttonTouched = NO;

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    // test wether the button is touched
    UITouch *touch = [touches anyObject];
    CGPoint touchBegan = [touch locationInView:self.view];
    if(CGRectContainsPoint(theButton.frame, touchBegan) 
        buttonTouched = YES;
    


-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
    if(buttonTouched) 
        // do it here
        UITouch *touch = [touches anyObject];
        CGPoint touchMoved = [touch locationInView:self.view];
        CGRect newFrame = CGRectMake(touchMoved.x,
                                     touchMoved.y,
                                     theButton.frame.width,
                                     theButton.frame.height);
        theButton.frame = newFrame;
    


// when the event ends, put the BOOL back to NO
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
    buttonTouched = NO;

【讨论】:

非常感谢,但是还是不行。按钮现在不能移动了。谢谢 if(CGRectContainsPoint(theButton.frame, touchBegan)) buttonTouched = YES; 这里的代码不起作用

以上是关于如何让 touchesMoved 只控制一个视图?的主要内容,如果未能解决你的问题,请参考以下文章

从 TouchesMoved 获取子视图参考

如何继续触摸/手势到下一个视图控制器

如何让 UIView 忽略触摸而不释放它?

在滚动视图中的自定义视图中使用触摸进行缩放。 touchesMoved 未调用

是否可以从 touchesBegan 或 touchesMoved 内部取消触摸?

使用 TouchesMoved 跟踪两个手指