UIScrollview 对任何触摸都没有反应?

Posted

技术标签:

【中文标题】UIScrollview 对任何触摸都没有反应?【英文标题】:UIScrollview does not react to any touch? 【发布时间】:2014-12-08 13:57:34 【问题描述】:

我正在尝试做一个简单的滚动,但触摸后视图不会移动,我不知道为什么,滚动视图应该处理手势,但可能会丢失一些东西。有人知道在哪里吗?

这里是代码:我创建了一个小的水平滚动视图,里面有一些视图。视图看起来不错,我正在触摸设备上对其进行测试:

- (void)viewDidLoad 
    [super viewDidLoad];
    //horizontal scroll view
    HorizScroll *ho = [[HorizScroll alloc] initWithFrame:CGRectMake(0, 0, 500, 100)];
    for ( int i=0; i<3; i++)
        MyView* mv = [[MyView alloc] init];
        [ho addSubview:mv];
    
    //ho.zoomScale = 0.3f;
    [self.view addSubview:ho];






@implementation HorizScroll
- (instancetype)initWithFrame:(CGRect)frame

    if (self = [super initWithFrame:frame]) 
    
    return self;


-(void)addSubview:(UIView *)view
    [super addSubview:view];
    NSUInteger numSubviews = self.subviews.count;
    [view setFrame:CGRectMake(CGRectGetWidth(view.bounds)*(numSubviews),
                             0,
                             CGRectGetWidth(view.bounds),
                             CGRectGetHeight(view.bounds) )];
    [self setContentSize:CGSizeMake(CGRectGetWidth(view.bounds)*(numSubviews),
                                   CGRectGetHeight(view.bounds) )];










@implementation MyView
-(int)getRandomNumberBetween:(int)from to:(int)pto 
    return (int)(from + arc4random() % (pto-from+1));

-(instancetype)init
    if ( self = [super init] )
        CGFloat red = [self getRandomNumberBetween:1 to:255];
        self.backgroundColor = [UIColor colorWithRed:red/256.0
                                               green:[self getRandomNumberBetween:1 to:255]/256.0
                                                blue:[self getRandomNumberBetween:1 to:255]/256.0
                                               alpha:1.0];
    
    return self;


-(instancetype)initWithFrame:(CGRect)frame
    if ( self = [super initWithFrame:frame] )
        self.frame = CGRectMake(counterX, 0, 100, 100);
        counterX += 50;
    
    return self;

【问题讨论】:

HorizScroll 是否继承自 UIScrollView? 【参考方案1】:

您需要将滚动视图的contentSize 设置为大于其帧大小。所以在[self.view addSubview:ho]之后添加这一行。

ho.contentSize = CGSizeMake(501.f, 100.f);

或在[self.view addSubview:ho] 之前并注释掉该行:

[self setContentSize:CGSizeMake(CGRectGetWidth(view.bounds)*(numSubviews),
                                CGRectGetHeight(view.bounds))];

这不是必需的,因为您可以在添加所有子视图后设置它。

【讨论】:

非常感谢 gabbler 不过有一个问题,如果我为框架设置一个小的宽度尺寸,为什么它不起作用,并让滚动视图子类中的 setContentSize (这会更大)?然后卷轴没有响应。到目前为止,它只适用于你的技术...... 应该可以了,你可以设置一个断点,在将ho添加为self.view的子视图后,查看最终的contentSize,并与frame进行比较。 请原谅我的知识不足:) 设置断点时,在哪里可以找到有关 frame 和 contentSize 的信息?编辑:如果你指的是 NSLog,结果是:contentSize 300, 100, frame 0, 0, 200, 100 请看here,当scrollview在屏幕上绘制时,会增加两个scroll indicator subview,可以通过将showsHorizontalScrollIndicator设置为NO来移除。

以上是关于UIScrollview 对任何触摸都没有反应?的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 触摸处理

UIScrollView 没有将触摸传递给子视图?

分页 UIScrollView 内的 UIScrollView

以 UIScrollView 作为子类的 UIView 不接收触摸事件

UIScrollView下的UIButton没有响应触摸

在Scroll View的高度动画后,UIScrollView的子视图不响应触摸