Ios UIScrollView上的UIButton作为子视图

Ios UIScrollView上的UIButton作为子视图,ios,uiscrollview,uibutton,Ios,Uiscrollview,Uibutton,在我的应用程序中,我实现了非常复杂的控制,它基于ARScrollViewEnhancer。我需要它来显示多页的UIScrollView。这是我的UIScrollView代码: dateScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(28, 0, dateLabelMaxSize, 45)]; dateScroll.pagingEnabled = YES; dateScroll.clipsToBounds = NO; dateScro

在我的应用程序中,我实现了非常复杂的控制,它基于
ARScrollViewEnhancer
。我需要它来显示多页的
UIScrollView
。这是我的
UIScrollView
代码:

dateScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(28, 0, dateLabelMaxSize, 45)];
dateScroll.pagingEnabled = YES;
dateScroll.clipsToBounds = NO;
dateScroll.showsHorizontalScrollIndicator = NO;
dateScroll.backgroundColor = [UIColor clearColor];
dateScroll.contentSize = CGSizeMake(dateLabelMaxSize*[dayArray count], 45);
我使用
dateScroll.clipsToBounds=NO用于显示超出框架的页面。这是ARScrollViewEnhancer的代码:

ARScrollViewEnhancer *backForDate = [[ARScrollViewEnhancer alloc] initWithFrame:CGRectMake(0, 80, self.view.frame.size.width, 45)];
[backForDate addSubview:dateScroll];
backForDate._scrollView = dateScroll;
[self.view addSubview:backForDate];
然后,我为
UIScrollView
添加了子视图。这是
ui标签
ui按钮

for (int i=0;i<[dayArray count];i++){

    UILabel *dateLabel = [[UILabel alloc] initWithFrame:CGRectMake(3+dateLabelMaxSize*i, 5, dateLabelMaxSize, 40)];
    dateLabel.backgroundColor = [UIColor clearColor];
    dateLabel.textAlignment = UITextAlignmentLeft;
    dateLabel.text = @"some text...";
    [dateScroll addSubview:dateLabel];


    UIButton *dateButton = [UIButton buttonWithType:UIButtonTypeCustom];
    //dateButton.backgroundColor = [UIColor redColor];
    dateButton.frame = CGRectMake(3+dateLabelMaxSize*i, 5, dateLabelMaxSize-10, 40);
    dateButton.tag = i;
    [dateButton addTarget:self action:@selector(dateTapped:) forControlEvents:UIControlEventTouchUpInside];
    [dateScroll addSubview:dateButton];
} 
那么,按钮不起作用((为什么? Thnx

UPD.

hitTest方法代码。为:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if ([self pointInside:point withEvent:event]) {
        return _scrollView;
    }
    return nil;
}
现在:


如果还复制自定义控件中的hitTest方法,则会导致问题,因为它总是返回滚动视图而不是按钮

您需要返回正确的子视图,而不是始终返回子视图,如下所示:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {    
    UIView *scrv = self.scrollView;
    UIView *superView = [super hitTest:point withEvent:event];
    if (superView == self)
    {
        CGPoint scrollViewpoint = [self.scrollView convertPoint:point fromView:self];
        for(UIView *view in self.scrollView.subviews) {
            if(CGRectContainsPoint(view.frame, scrollViewpoint)) {
                return view;
            }
        }
        return scrv;
    }
    return superView;
}

您必须设置卷轴的内容大小view@Mutawe我做到了。添加到有问题的代码中。dateScroll.contentSize=CGSizeMake(dateLabelMaxSize*[dayArray count],45)@Eugeneteampnikov您是否实施了hitTest?您能否编辑您的问题以包含hitTest方法?@Eugeneteampnikov您能否详细说明哪些不起作用?尝试在hitTest中设置断点,并查看UIButton是否从hitTest返回。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *scrv = _scrollView;
    UIView *superView = [super hitTest:point withEvent:event];
    if (superView == self)
    {
        CGPoint scrollViewpoint = [_scrollView convertPoint:point fromView:self];

        for(UIView *view in _scrollView.subviews) {
            if(CGRectContainsPoint(view.frame, scrollViewpoint)) {
                return view;
            }
        }

        return scrv;
    }

    return superView;
}
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {    
    UIView *scrv = self.scrollView;
    UIView *superView = [super hitTest:point withEvent:event];
    if (superView == self)
    {
        CGPoint scrollViewpoint = [self.scrollView convertPoint:point fromView:self];
        for(UIView *view in self.scrollView.subviews) {
            if(CGRectContainsPoint(view.frame, scrollViewpoint)) {
                return view;
            }
        }
        return scrv;
    }
    return superView;
}