Ios5 在iOS 5中子类化UIScrollView时无法拖动对象,帮助?

Ios5 在iOS 5中子类化UIScrollView时无法拖动对象,帮助?,ios5,uiscrollview,subclass,drag,ios4,Ios5,Uiscrollview,Subclass,Drag,Ios4,首先,iOS 4.3中不存在这个问题。我仍然可以在iOS 4.3中运行该程序,并且不会看到任何问题。其次,这是一款iPad应用程序 问题是,当我按住图像并拖动它时,它不会被拖动。它在iOS 4.3中运行,但在iOS 5中不起作用 我创建了新的测试项目,并清除了所有不需要的内容。我选择的项目是一个单视图应用程序,没有更改任何AppDelegate文件 这是代码 myUIScrollViewClass.h #import <UIKit/UIKit.h> @interface myUI

首先,iOS 4.3中不存在这个问题。我仍然可以在iOS 4.3中运行该程序,并且不会看到任何问题。其次,这是一款iPad应用程序

问题是,当我按住图像并拖动它时,它不会被拖动。它在iOS 4.3中运行,但在iOS 5中不起作用

我创建了新的测试项目,并清除了所有不需要的内容。我选择的项目是一个单视图应用程序,没有更改任何AppDelegate文件

这是代码

myUIScrollViewClass.h

#import <UIKit/UIKit.h>


@interface myUIScrollViewClass : UIScrollView
{
}

@end
ViewController.h

#import <UIKit/UIKit.h>
#import "myUIScrollViewClass.h"

@interface ViewController : UIViewController <UIScrollViewDelegate>
{
     myUIScrollViewClass *mainScrollView_;
     UIImageView *aTouchedImage_;
}

@property (retain, nonatomic) myUIScrollViewClass *mainScrollView_;
@property (retain, nonatomic) UIImageView *aTouchedImage_;

@end

看来我会回答我自己的问题

我已经向Apple Developer技术支持部门请求了支持,他们告诉我将代码放在UIScrollView中,而不是将触摸事件传递给另一个视图。苹果自己也承认传递触摸事件存在问题

以下是他们的答复摘要:

看起来并不是所有的触摸事件都能通过视图控制器。您的UIScrollView阻止触摸事件通过,即使它将这些事件转发给下一个响应者。这种行为非常不稳定,一些触摸事件正在转发给视图控制器,但不是全部

“看起来像是iOS 5.0.x中的行为改变。我猜这是因为引入了视图控制器包含功能。”

另一种方法是使用UIgestureRecognitor实现视图的拖动。类似下面的代码:

- (void)viewDidLoad 
{
    // ... other initialization code here

    UILongPressGestureRecognizer *longPress = [[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(dragChild:)] autorelease];
    [longPress setMinimumPressDuration:0]; // recognize immediately when a finger comes down
    [draggableView addGestureRecognizer:longPress];
}

- (void)dragChild:(UILongPressGestureRecognizer *)longPress 
{
    [[longPress view] setCenter:[longPress locationInView:[[longPress view] superview]];
}

看来我会回答我自己的问题

我已经向Apple Developer技术支持部门请求了支持,他们告诉我将代码放在UIScrollView中,而不是将触摸事件传递给另一个视图。苹果自己也承认传递触摸事件存在问题

以下是他们的答复摘要:

看起来并不是所有的触摸事件都能通过视图控制器。您的UIScrollView阻止触摸事件通过,即使它将这些事件转发给下一个响应者。这种行为非常不稳定,一些触摸事件正在转发给视图控制器,但不是全部

“看起来像是iOS 5.0.x中的行为改变。我猜这是因为引入了视图控制器包含功能。”

另一种方法是使用UIgestureRecognitor实现视图的拖动。类似下面的代码:

- (void)viewDidLoad 
{
    // ... other initialization code here

    UILongPressGestureRecognizer *longPress = [[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(dragChild:)] autorelease];
    [longPress setMinimumPressDuration:0]; // recognize immediately when a finger comes down
    [draggableView addGestureRecognizer:longPress];
}

- (void)dragChild:(UILongPressGestureRecognizer *)longPress 
{
    [[longPress view] setCenter:[longPress locationInView:[[longPress view] superview]];
}

我尝试了一个虚拟项目,其中scrollview覆盖了简单UIView的一半。Scrollview已禁用滚动。uiview有内部带有nslog的touch方法,以查看它们是否被调用。触摸scrollview时,不会调用TouchsBegind、TouchsEnded和TouchsMoved。当触摸uiview部分时,正在调用这些方法。这证实了UIScrollView存在一个错误,根本没有将事件转发到响应程序链上,这与SetScrolleEnabled上的文档所说的相反。我尝试了一个虚拟项目,其中一个scrollview覆盖了简单UIView的一半。Scrollview已禁用滚动。uiview有内部带有nslog的touch方法,以查看它们是否被调用。触摸scrollview时,不会调用TouchsBegind、TouchsEnded和TouchsMoved。当触摸uiview部分时,正在调用这些方法。这证实了UIScrollView存在一个bug,根本没有将事件转发到响应者链上,这与SetScrolleEnabled上的文档所说的相反。
- (void)viewDidLoad 
{
    // ... other initialization code here

    UILongPressGestureRecognizer *longPress = [[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(dragChild:)] autorelease];
    [longPress setMinimumPressDuration:0]; // recognize immediately when a finger comes down
    [draggableView addGestureRecognizer:longPress];
}

- (void)dragChild:(UILongPressGestureRecognizer *)longPress 
{
    [[longPress view] setCenter:[longPress locationInView:[[longPress view] superview]];
}