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

时间:2009-10-26 13:20:04

标签: cocoa-touch uiview uiscrollview

我有一个相当棘手的滚动场景我需要排序。我有一个父UIScrollView与一个包含两个子UIView子类的容器视图。称他们为viewA和viewB。 UIScrollView已被限制为水平滚动/缩放。 ViewA和ViewB布置为水平条带,一个在另一个之上。 viewA和viewB的边界超出了scrollView的边界,并且在滚动/缩放期间显示为正常情况。到目前为止一切都很好。

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

我的问题是,对于viewB实现简单垂直滚动的正确方法是什么,同时仍然使其相对于scrollView正常运行?我是否只是简单地实现了四种触摸序列方法:在viewB中开始/移动/结束/取消,操纵viewB的变换矩阵,我是清楚的还是更多的?

提前致谢。

干杯, 道格

1 个答案:

答案 0 :(得分:0)

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

首先创建一个UIView-Subclass,包括nessecary函数,这个函数正在接收你的拖动动作。虽然这是可拖动的,但您应该禁用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