gpt4 book ai didi

objective-c - ios拖放 subview 只能工作一次

转载 作者:行者123 更新时间:2023-11-29 11:11:24 24 4
gpt4 key购买 nike

我有 UIView,我希望能够在其中拖放 subview ,这一次工作正常。

- (void)pan: (UIPanGestureRecognizer *)recognizer
{
if (recognizer.state == UIGestureRecognizerStateBegan) {
CGPoint startPos = [recognizer locationInView:self];
for (UIControl *sv in self.subviews){
if ([sv pointInside:startPos withEvent:nil]){
self.controlBeingDragged = sv;
}
}
}
if (((recognizer.state == UIGestureRecognizerStateChanged) ||
(recognizer.state == UIGestureRecognizerStateEnded)) &&
self.controlBeingDragged){
CGPoint translation = [recognizer translationInView:self];
self.controlBeingDragged.center = CGPointMake(self.controlBeingDragged.center.x + translation.x, self.controlBeingDragged.center.y + translation.y);
[recognizer setTranslation:CGPointZero inView:self];
if (recognizer.state == UIGestureRecognizerStateEnded){
self.controlBeingDragged = nil;
}

}
}

但是,如果我尝试再次拖动同一个 UIControl,包含 View 将不再知道它在哪里。我可以通过从原始位置开始再次拖动它,所以很明显我没有做一些事情来通知包含 View 它的 subview 已经移动。但是什么?

最佳答案

我很惊讶它竟然能工作一次。 pointInside:withEvent: 消息需要接收者 坐标系中的一个点,但您发送的是接收者 super View 坐标系中的一个点.在 pointInside:withEvent: 消息中发送点之前,您可以为每个 subview 使用 convertPoint:toView: 将点转换为 subview 的坐标系。

CGPoint subviewPoint = [self convertPoint:startPos toView:sv];
if ([sv pointInside:subviewPoint withEvent:nil]) {
...

您可能还想检查 -[UIView hitTest:withEvent:] 消息是否可以替换整个 subview 搜索循环。

关于objective-c - ios拖放 subview 只能工作一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11442160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com