iphone – UIScrollview子视图以外的剪辑边界没有接收到触摸

iphone – UIScrollview子视图以外的剪辑边界没有接收到触摸,第1张

概述我有一个UIScrollView,我设置为一次刷一列(每页两列) – 通过将帧设置为视图实际宽度的一半,将clipToBounds设置为NO并使用hitTest声明框架外的区域属于UIScrollView(见下面的例子). 这很好用,但我现在的问题是UIScrollView的子视图没有得到任何触摸事件 – 只有主UIScrollView才有. 在下面的示例中,如果包含hitTest代码,则滚动视图 我有一个UIScrollVIEw,我设置为一次刷一列(每页两列) – 通过将帧设置为视图实际宽度的一半,将clipToBounds设置为NO并使用hitTest声明框架外的区域属于UIScrollVIEw(见下面的例子).

这很好用,但我现在的问题是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子视图以外的剪辑边界没有接收到触摸所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1084437.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存