iphone- UIScrollview对角线滑动意外行为

时间:2011-11-03 12:32:08

标签: iphone objective-c ios xcode uiscrollview

我正在开发一个应用程序,我必须从UIScrollview拖动UIImageview。 在我的主要UIView的底部,我有一个内部有UIImageViews的UIScrollView。 我使用以下代码片段创建了自定义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的scrollview:

@interface PuzzleViewController : UIViewController <UIScrollViewDelegate> {
    IBOutlet CustomScroll *segmentScrollview;

}

我已经以编程方式添加了所有UIImageviews。

此代码按预期工作。 UIImageview检测触摸,我可以将UIImageview从UIScrollview拖到UIView。

但是当我沿对角线拖动UIImageview时会出现问题。

在我的应用程序中,当我从scrollview垂直拖动UIImageview时,我能够将UIImageView从UIScrollView移动到UIView。但是当我从scrollview对角拖动UIImageview时,我无法移动UIImageview。对角线滑动滚动UIScrollview [UIImageview保持不变]这是意外的。我希望UIImageview应该从UIScrollview对角拖动。

非常感谢任何帮助。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

这只是一个想法...所以试一试,告诉我它是怎么回事。如果不起作用,那么我会尽力帮助你。尝试将directionalLockEnabled设置为NO。如果设置为YES,则您的移动仅限于水平/垂直。如果设置为NO,那么您应该能够沿对角线移动。试一试,让我知道它是怎么回事。

UIScrollView directionLockEnabled Docs

  

如果此属性为NO,则允许在水平和水平方向上滚动   垂直方向。 如果此属性为YES且用户开始   在一个大致方向(水平或垂直)拖动,   滚动视图禁用向另一个方向滚动。如果拖动   方向是对角线,然后滚动将不会被锁定和用户   可以向任何方向拖动,直到拖动完成。默认值   不是

答案 1 :(得分:0)

我在想你所追求的不是[super touchesMoved:...],而是[self.superview touchesMoved:...] ...假设你有包含CustomScroll和其他视图的superview你试图拖入设置来解决这个问题。

答案 2 :(得分:0)

我知道这是一个较老的问题,但我也遇到了这个问题。基本上我想要一个启用分页的scrollview,它可以向上,向下,向左或向右移动。使用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页的值。这是因为我的内容总是居中,所以你可以向任何方向滚动一页,然后它会动画回到中心。不应该很难修改以使用多个页面。