这很好用,但我现在的问题是UIScrollVIEw的子视图没有得到任何触摸事件 – 只有主UIScrollVIEw才有.
在下面的示例中,如果包含hitTest代码,则滚动视图正确滚动,一次分页一列并且可以看到其所有内容 – 但内部滚动视图不会接收触摸事件.
如果我删除了hitTest代码,那么只有第一个子scrollvIEw接收到触摸,并且可以看到它的所有内容 – 但主要的scrollvIEw不会在非剪切区域中进行触摸.
我怎么解决这个问题?
例:
//=========================================// UIScrollVIEwEx// Just in order to log touches...//=========================================@interface UIScrollVIEwEx : UIScrollVIEw {} @end@implementation UIScrollVIEwEx- (voID) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"touches Began (0x%08X)",(unsigned int)self);}@end//=========================================// UIVIEwEx// Dummy class - sets subvIEw as hit target// just to demonstrate usage of non-clipped // content//=========================================@interface UIVIEwEx : UIVIEw {} @end@implementation UIVIEwEx- (UIVIEw *) hitTest:(CGPoint) point withEvent:(UIEvent *)event { if ([self pointInsIDe:point withEvent:event]) { return [self.subvIEws objectAtIndex:0]; } return nil;}@end//=========================================// MainClass// Any UIVIEwEx based class which returns// the UIScrollVIEw child on hittest//=========================================@implementation MyClass- (UIcolor*) randomcolor{ int r = arc4random() % 100; int g = arc4random() % 100; int b = arc4random() % 100; return [UIcolor colorWithRed:(0.01 * r) green:(0.01 * g) blue:(0.01 * b) Alpha:1.0];}- (voID) loadScrollvIEws{ // Set frame to half of actual wIDth so that paging will swipe half a page only CGRect frame = CGRectMake(0,self.bounds.size.wIDth / 2,400); // Main scrollvIEw UIScrollVIEw *scrollvIEw = [[UIScrollVIEw alloc] initWithFrame:frame]; [scrollvIEw setBackgroundcolor:[UIcolor greencolor]]; [scrollvIEw setPagingEnabled:YES]; [scrollvIEw setClipsToBounds:NO]; // Create smaller scrollvIEws insIDe it - each one half a screen wIDe const int numItems = 5; for(int i = 0; i < numItems; ++i) { frame.origin.x = frame.size.wIDth * i; UIScrollVIEw *innerScrollvIEw = [[UIScrollVIEwEx alloc] initWithFrame:frame]; [innerScrollvIEw setContentSize:CGSizeMake(frame.size.wIDth,1000)]; [innerScrollvIEw setBackgroundcolor:[self randomcolor]]; [scrollvIEw addSubvIEw:innerScrollvIEw]; [innerScrollvIEw release]; } [scrollvIEw setContentSize:CGSizeMake(numItems * frame.size.wIDth,frame.size.height)]; [self addSubvIEw:scrollvIEw];}@end
更新
通过执行以下 *** 作,我将触摸转发到内部视图,但肯定必须有更好的方法吗?
- (UIVIEw *) hitTest: (CGPoint) pt withEvent: (UIEvent *) event { if(CGRectContainsPoint(self.bounds,pt)) { UIScrollVIEw *scrollvIEw = [self.subvIEws objectAtIndex:0]; CGPoint scrollVIEwpoint = [scrollvIEw convertPoint:pt fromVIEw:self]; for(UIVIEw *vIEw in scrollvIEw.subvIEws) { if(CGRectContainsPoint(vIEw.frame,scrollVIEwpoint)) { return vIEw; } } return scrollvIEw; } else { return [super hitTest:pt withEvent:event]; }}解决方法 这可能有效:
- (UIVIEw*)hitTest:(CGPoint)point withEvent:(UIEvent*)event { UIVIEw* child = nil; if ((child = [super hitTest:point withEvent:event]) == self) return self.scrollVIEw; return child;}
但是如果子视图超出scrollvIEw边界,则不会触发事件,并且此函数返回self.scrollVIEw.
总结以上是内存溢出为你收集整理的iphone – UIScrollview子视图以外的剪辑边界没有接收到触摸全部内容,希望文章能够帮你解决iphone – UIScrollview子视图以外的剪辑边界没有接收到触摸所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)