Ios5 在iOS 5中子类化UIScrollView时无法拖动对象,帮助?
首先,iOS 4.3中不存在这个问题。我仍然可以在iOS 4.3中运行该程序,并且不会看到任何问题。其次,这是一款iPad应用程序 问题是,当我按住图像并拖动它时,它不会被拖动。它在iOS 4.3中运行,但在iOS 5中不起作用 我创建了新的测试项目,并清除了所有不需要的内容。我选择的项目是一个单视图应用程序,没有更改任何AppDelegate文件 这是代码 myUIScrollViewClass.hIos5 在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
#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]];
}