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 对角线滑动意外行为的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 嵌套UITableView 左滑删除和UIScrollView滑动冲突

使用 UIScrollView 和自动布局的图像滑块

css 花蜜滑块改变对角线预加载背景

UIScrollView 滑动手势与右滑返回冲突

如何通过滑动向 UIScrollView 添加另一个页面?

解决右滑返回手势和UIScrollView中的手势冲突