gpt4 book ai didi

iphone - 将 UIView 拖入 UIScrollView

转载 作者:太空狗 更新时间:2023-10-30 03:12:08 25 4
gpt4 key购买 nike

我正在尝试解决 iPhone 上拖放的基本问题。这是我的设置:

  • 我有一个 UIScrollView,它有一个大的内容 subview (我可以滚动和缩放它)
  • 内容 subview 有几个小块作为 subview ,应在其中拖动。

我的 UIScrollView 子类有这个方法:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *tile = [contentView pointInsideTiles:[self convertPoint:point toView:contentView] withEvent:event];
if (tile) {
return tile;
} else {
return [super hitTest:point withEvent:event];
}
}

内容 subview 有这个方法:

- (UIView *)pointInsideTiles:(CGPoint)point withEvent:(UIEvent *)event {
for (TileView *tile in tiles) {
if ([tile pointInside:[self convertPoint:point toView:tile] withEvent:event])
return tile;
}

return nil;
}

tile view有这个方法:

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

self.center = location;
}

这有效,但不完全正确:在拖动过程中,图 block 有时会“掉落”。更准确地说,它停止接收 touchesMoved: 调用,而 ScrollView 开始滚动。我注意到这取决于拖动速度:我拖动得越快,瓷砖“落下”的速度就越快。

关于如何让磁贴粘在拖动的手指上有什么想法吗?

最佳答案

我一直在努力解决同样的问题 - 我试图在软木板上做一个带有很多“卡片”(UIView 子类)的界面,并使软木板区域可滚动,但仍然能够拖放 -放下卡片。我正在做上面的 hitTest() 解决方案,但是一位 Apple 工程师问我为什么要那样做。他们建议的更简单的解决方案如下:

1) 在 UIScrollView 类中,将 canCancelContentTouches 的值设置为 NO - 这告诉 UIScrollView 类允许在 subview 内进行触摸(或者,在这种情况下,在 subview 的 subview 中)。

2) 在我的“卡片”类中,将 exclusiveTouch 设置为 YES - 这告诉 subview 它拥有其中的触摸。

在此之后,我可以在卡片周围拖动并仍然滚动 subview 。它比上面的 hitTest() 解决方案更简单、更清晰。

(顺便说一句,如果您使用的是 iOS 3.2 或 4.0 或更高版本,请使用 UIPanGestureRecognizer 类来处理拖放逻辑 - 拖放 Action 比覆盖 touchesBegan()/touchesMoved( )/touchesEnded().)

关于iphone - 将 UIView 拖入 UIScrollView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1481826/

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