2011-11-03 58 views
2

我正在开发一个应用程序,我必须从UIScrollview拖动UIImageview。 在我的主UIView的底部,我有一个UIScrollView和UIImageViews里面。 我一直在使用下面的代码中创建自定义的UIScrollView:iphone- 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 PuzzleViewController : UIViewController <UIScrollViewDelegate> { 
    IBOutlet CustomScroll *segmentScrollview; 

}

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

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

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

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

任何帮助将不胜感激。

在此先感谢您的帮助。

回答

1

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

UIScrollView directionLockEnabled Docs

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

+0

谢谢山姆和PTBG的回复。但是,directionalLockEnabled不起作用。问题依然存在。我无法从scrollview中对角地拖动UIImageView。 – user392406

0

我在想,你是后有什么不[超级touchesMoved:...],而[self.superview touchesMoved:...] ...假设你有包含CustomScroll和您试图拖入其中的其他视图的superview设置来处理此问题。

0

我知道这是一个较老的问题,但我也遇到了这个问题。基本上我想要一个分页启用滚动视图,可以上去,下,左,或右。使用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页的值。这是因为我的内容始终居中,因此您可以向任意方向滚动一页,然后将其移动到中心位置。不应该很难修改以处理多个页面。