iphone- UIScrollview 对角线滑动意外行为
Posted
技术标签:
【中文标题】iphone- UIScrollview 对角线滑动意外行为【英文标题】:iphone- UIScrollview diagonal swipe unexpected behaviour 【发布时间】:2011-11-03 12:32:08 【问题描述】:我正在开发一个应用程序,我必须在其中从 UIScrollview 拖动 UIImageview。 在我的主 UIView 的底部,我有一个 UIScrollView,里面有 UIImageViews。 我使用以下代码 sn-p 创建了自定义 UIScrollview:
@interface CustomScroll : UIScrollView
@end
@implementation CustomScroll
- (id)initWithFrame:(CGRect)frame
return [super initWithFrame:frame];
- (void) touchesMoved: (NSSet *) touches withEvent: (UIEvent *) event
// If not dragging, send event to next responder
if (!self.dragging)
self.scrollEnabled=NO;
[self.nextResponder touchesMoved:touches withEvent:event];
else
[super touchesMoved: touches withEvent: event];
- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
// If not dragging, send event to next responder
if (!self.dragging)
[self.nextResponder touchesEnded: touches withEvent:event];
else
[super touchesEnded: touches withEvent: event];
@end
从这里我在我的 PuzzleViewController 中包含了一个 CustomScroll 对象,并将它连接到 Interface builder 的滚动视图:
@interface PuzzleViewController : UIViewController <UIScrollViewDelegate>
IBOutlet CustomScroll *segmentScrollview;
我以编程方式添加了所有 UIImageviews。
此代码按预期工作。 UIImageview 检测到触摸,我可以将 UIImageview 从 UIScrollview 拖到 UIView。
但是当我对角拖动 UIImageview 时会出现问题。
在我的应用程序中,当我从滚动视图垂直拖动 UIImageview 时,我能够将我的 UIImageView 从 UIScrollView 移动到 UIView。但是当我从滚动视图对角拖动 UIImageview 时,我无法移动 UIImageview。对角滑动滚动 UIScrollview [UIImageview 保持不变],这是出乎意料的。我希望 UIImageview 应该从 UIScrollview 对角拖动。
任何帮助将不胜感激。
提前感谢您的帮助。
【问题讨论】:
【参考方案1】:这只是一个想法......所以尝试一下并告诉我它是怎么回事。如果不起作用,那么我会尝试进一步帮助您。尝试将directionalLockEnabled
设置为 NO。如果设置为 YES,那么您的移动将仅限于水平/垂直。如果它设置为 NO,那么您应该能够沿对角线移动。试试看,让我知道结果如何。
UIScrollView directionLockEnabled Docs
如果此属性为 NO,则允许水平滚动和滚动 垂直方向。 如果此属性为 YES 并且用户开始 沿一个大致方向(水平或垂直)拖动, 滚动视图禁止向另一个方向滚动。 如果拖动 方向是对角线,则滚动不会被锁定,用户 可以向任何方向拖动,直到拖动完成。默认值 没有
【讨论】:
感谢 sam 和 PTBG 的回复。但是 directionalLockEnabled 不起作用。问题仍然存在。我无法从滚动视图对角拖动 UIImageview。【参考方案2】:我在想你所追求的不是 [super touchesMoved:...],而是 [self.superview touchesMoved:...] ... 假设你有包含 CustomScroll 和另一个视图的超级视图你正试图拖入设置来处理这个问题。
【讨论】:
【参考方案3】:我知道这是一个较老的问题,但我也遇到了这个问题。基本上我想要一个启用分页的滚动视图,它可以向上、向下、向左或向右移动。使用 pagingEnabled 和 directionalLockEnabled 变量使其基本工作,除了对角线拖动。我的解决方案如下。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
if (self.scrollView.contentOffset.x >= self.previousScrollOffset.x &&
self.scrollView.contentOffset.y == self.scrollView.contentSize.height / 3)
self.currentScrollDirection = SW_DIRECTION_LEFT;
else if (self.scrollView.contentOffset.x < self.previousScrollOffset.x &&
self.scrollView.contentOffset.y == self.scrollView.contentSize.height / 3)
self.currentScrollDirection = SW_DIRECTION_RIGHT;
else if (self.scrollView.contentOffset.x == self.scrollView.contentSize.width / 3 &&
self.scrollView.contentOffset.y >= self.previousScrollOffset.y)
self.currentScrollDirection = SW_DIRECTION_UP;
else if (self.scrollView.contentOffset.x == self.scrollView.contentSize.width / 3 &&
self.scrollView.contentOffset.y <= self.previousScrollOffset.y)
self.currentScrollDirection = SW_DIRECTION_DOWN;
else
self.currentScrollDirection = SW_DIRECTION_NONE;
//lock to either horizontal or vertical if we are dragging (prevent the diagonal drag)
if (self.scrollView.isTracking && self.currentScrollDirection == SW_DIRECTION_NONE)
self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, self.scrollView.contentSize.height / 3);
self.previousScrollOffset = scrollView.contentOffset;
这会强制任何对角线滑动将滚动锁定在水平面上,这对我来说效果很好,因为水平拖动是优先事项,因此向上或向下滚动的唯一方法是准确向上或向下滑动。
为此,您需要声明
@property (readwrite, nonatomic) SW_SCROLL_DIRECTION currentScrollDirection;
@property (readwrite, nonatomic) CGPoint previousScrollOffset;
和
typedef enum
SW_DIRECTION_NONE,
SW_DIRECTION_LEFT,
SW_DIRECTION_RIGHT,
SW_DIRECTION_UP,
SW_DIRECTION_DOWN
SW_SCROLL_DIRECTION;
注意。这可能不会开箱即用,如您所见,我硬编码了 3 页的值。这是因为我的内容总是居中,所以你可以向任何方向滚动一页,然后它会动画回到中心。修改以处理多个页面应该不难。
【讨论】:
以上是关于iphone- UIScrollview 对角线滑动意外行为的主要内容,如果未能解决你的问题,请参考以下文章