我写的UIViewController的子类,编程方式创建一个视图,而不是从护理文件加载它。
它有一个简单loadView
方法:
- (void)loadView
{
UIScrollView *mainScrollView =
[[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.view = mainScrollView;
[mainScrollView release];
}
......然后,我做我的初始化的散装viewDidLoad
,作为记录。 它所有的工作,我可以看到在它我的自定义视图滚动视图。
我需要一个UIViewController自己的观点,因为它是一个UINavigationBar的工作流程的一部分。 因为我有一个控制器对象,我宁愿它做控制器的东西。
这个问题的话,就是我的视图控制器似乎并不在响应链。 touchesBegan:withEvent:
,如果我在根视图或子视图定义它被调用,但如果它是在视图控制器本身。
苹果事件处理文档流畅地提到了视图控制器应该在响应链 。 UIViewController的文件没有提到需要超出指定根视图到额外的步骤self.view
属性,如我之前所做的那样。 UIResponder文档声称一个UIView应该弄清楚,如果它有一个控制器和事件传递给它。 UIScrollView的文件说什么都没有。
我也尝试了各种设置userInteractionEnabled:
为所有视图和子视图,没有运气。
我在想什么?
ERICB,触摸向下发送,只有当他们没有被处理的响应链。 很明显的UIScrollView处理所有触摸事件,所以它的nextResponder它不会发送任何东西。 让我感觉良好。
你真正需要的是“过滤器”触摸事件之前,他们被的UIScrollView的滚动逻辑处理。 但需要注意的是响应链是此作业的错误的工具,正是因为它不允许拦截事件,他们得到处理之前。
也许在你的情况下,最好的解决办法是继承的UIScrollView,覆盖触摸方法(的touchesBegan等),并调用之前手动发送事件委托[super touchesXxx]
我认为问题是,UIScrollView中有很多的bug,以及解决方法的错误,并在解决方法的错误:)错误。
你经常要继承它对于解决不了任何其他方式等原因,所以如果你想重新使用你的代码,尽量不要 - 它是由一个事实,即继承的UIScrollView通常是从长远来看,一个坏主意复杂要继承它,直到你绝对必须的。
该工程始终,我发现最简单的解决方法是使你的内容查看一个微小的UIView子类 - 铭记自身通过UIScrollView的需要永远改变你的内容视图(例如,如果您启用变焦 - 苹果有一些错误到至少iOS版6那一脚在当你改变现有的滚动视图的内容视图),所以这是一个好主意,让琐碎,并把它里面的自定义视图作为子视图。
注意:这一直为我工作,在多个应用程序发货。 如果有问题,我还没有看到它。 我不知道为什么苹果没有实现这个简单的改变自己,除非有与它一个微妙的问题,我还没有遇到呢!
用法:
/** Inside your UIViewController, wherever you set the root content view
of your UIScrollView, you have to also tell the custom class "I am the nextResponder!"
*/
-(void)viewDidLoad
{
self.scrollView.contentSize = self.viewEmbeddedInScrollview.frame.size;
self.viewEmbeddedInScrollview.nextResponderHeyAppleWhyDidYouStealThis = self;
}
接口文件+类文件:
#import <UIKit/UIKit.h>
@interface UIViewThatNeverLosesItsNextResponder : UIView
@property(nonatomic,retain) UIResponder* nextResponderHeyAppleWhyDidYouStealThis;
@end
#import "UIViewThatNeverLosesItsNextResponder.h"
@implementation UIViewThatNeverLosesItsNextResponder
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
@synthesize nextResponderHeyAppleWhyDidYouStealThis;
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[nextResponderHeyAppleWhyDidYouStealThis touchesBegan:touches withEvent:event];
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[nextResponderHeyAppleWhyDidYouStealThis touchesCancelled:touches withEvent:event];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[nextResponderHeyAppleWhyDidYouStealThis touchesEnded:touches withEvent:event];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[nextResponderHeyAppleWhyDidYouStealThis touchesMoved:touches withEvent:event];
}
@end
的UIScrollView将延迟默认内容触摸; 你看着-delaysContentTouches以确保接触会通过。