如何在UIScrollView中实现一个可拖动的UIView子类?

问题描述:

我有一个相当棘手的滚动scenerio我需要排序。我有一个父级UIScrollView与单个容器视图包含两个子UIView子类。称它们为viewA和viewB。 UIScrollView被限制为水平滚动/缩放。 ViewA和ViewB被排列成水平条,一个在另一个之上。 viewA和viewB的范围超出了scrollView的范围,并且在滚动/缩放过程中正常显示。到现在为止还挺好。如何在UIScrollView中实现一个可拖动的UIView子类?

这里是事情有点棘手的地方:我需要能够垂直拖动viewB和水平。我宁愿不将viewB嵌套在它自己的scrollView中。

我的问题是,什么是正确的方式来实现简单的垂直滚动viewB同时仍然有关于scrollView的行为正确吗?我是否简单地实现了四种触摸顺序方法:在viewB中开始/移动/结束/取消,操作viewB的变换矩阵,并且我处于清晰状态还是对它更感兴趣?

在此先感谢。

干杯, 道格

+0

为什么你不希望ViewB是在其自身的滚动视图? – NSResponder 2009-10-26 21:58:59

+0

总之:复杂性。一个scrollView是为我的需要矫枉过正。 – dugla 2009-10-27 17:39:21

嗯,关于你的给定的场景,我会解决这个问题如下:

首先创建一个UIView子类,包括nessecary功能,这个人是在收到您的阻力-actions。虽然这是可拖动的,但应该禁用UIScrollView的滚动。 标题:

#import <UIKit/UIKit.h>; 

@interface ViewB : UIView 
{ 
} 

@end 

实现:

#import "ViewB.h" 

@implementation DragView 
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    self.alpha = 0.5; 
    ((UIScrollView*)self.superview.superview).scrollEnabled = NO; 
} 

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

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    self.alpha = 1.0; 
    ((UIScrollView*)self.superview.superview).scrollEnabled = YES; 
} 

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    self.alpha = 1.0; 
    ((UIScrollView*)self.superview.superview).scrollEnabled = YES; 
} 

// Further methods... 

@end