UIScrollView不能滚动,即使contentSize比UIImageView小。

7

我有一个UIImageView作为UIScrollView的子视图,我已将contentSize设置为小于UIImageView的宽度和高度,但是它不允许我滚动。为什么会这样?下面是一些代码:

UIImage * image = [UIImage imageWithData:data];
                UIImageView * imgView = [[UIImageView alloc] initWithImage:image];
                [imgView setUserInteractionEnabled:YES];
                //[imgView setContentMode:UIViewContentModeScaleAspectFill];
                [imgView setBackgroundColor:[UIColor clearColor]];
                [imgView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
                [imgView setFrame:CGRectMake(0, 0, imgView.frame.size.width, imgView.frame.size.height)];

                CGRect imgFrame;
                imgFrame.size.width = originalImageSize.width;
                imgFrame.size.height = originalImageSize.height;
                imgFrame.origin.x = imageOriginPoint.x;
                imgFrame.origin.y = imageOriginPoint.y;

                UIScrollView * imgScrollView = [[UIScrollView alloc] initWithFrame:imgFrame];
                [imgScrollView setScrollEnabled:YES];
                [imgScrollView setClipsToBounds:YES];
                [imgScrollView addSubview:imgView];
                [imgScrollView setBackgroundColor:[UIColor clearColor]];


  [imgScrollView setFrame:imgFrame];
                [imgScrollView setContentSize:CGSizeMake(200, 200)];

SCROLL VIEW CONTENT SIZE WIDTH IS 200.000000 AND HEIGHT CONTENT SIZE IS 200.000000
UIIMAGE VIEW WIDTH IS 2240.225830 AND HEIGHT IS 2240.225830
SCROLL VIEW FRAME WIDTH IS 768.000000 AND SCROLL VIEW FRAME HEIGHT IS 768.000061

有什么想法吗?

尝试这个...imgScrollView.contentSize = imgView.frame.size; - Mudit Bajpai
5个回答

11

一种不太正式的做法是将contentSize始终设置为大于视图大小。但在Swift中有一个属性允许scrollview始终“滚动”,而不考虑内容大小:

scrollView.alwaysBounceVertical = true

还有一个用于水平滚动的。


10

那是因为你的滚动视图边界大小大于你的内容大小。 内容大小需要是图像视图的实际大小,可见大小由框架/边界设置。我猜你想在一个{200, 200}大小的矩形中滚动图片? 尝试这个:

        UIScrollView * imgScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; // this is your visible rect
        [imgScrollView setScrollEnabled:YES];
        [imgScrollView setClipsToBounds:YES];
        [imgScrollView addSubview:imgView];
        [imgScrollView setBackgroundColor:[UIColor yellowColor]];

        [imgScrollView setContentSize:imgFrame.size]; // this is your image view size

所以帧大小必须小于内容大小吗?如果帧大小与内容大小相同,则无法滚动? - adit
14
默认情况下是可以的。但是,如果将 alwaysBounceVertical 和 alwaysBounceHorizontal 设置为 YES(默认值为 NO),即使内容大小小于框架大小,也可以拖动内容视图。 - Linghua Zhang
这让我感到非常烦恼,因为当contentSize小于bounds大小时,scrollview无法滚动。在我的情况下,当键盘弹出时,我想要减少scrollview的内容大小,但惊讶地发现减少内容大小并不能使滚动视图滚动。我猜我必须改变滚动视图的框架。 - Raj Pawan Gumdal

5

我知道这已经过时了,但是我想指出的是,在代码中创建UIScrollView时,最重要的设置是:

scrollView.scrollEnabled = YES;

如果您不设置,contentSize就没有意义。


1
这更适合作为注释而不是答案。无论如何,它是具有误导性的:正如文档中所述scrollEnabled的默认值为YES。除非您先前将其设置为NO,否则无需在代码中设置scrollEnabledYES - sam-w
1
我不同意。这也可以作为一个答案。 (而且它刚刚解决了我的问题。谢谢Chris。)很多人会向下滚动查看答案,除非答案引导他们阅读所有(或任何)评论。有时你会使用另一个人编写的代码,可能不熟悉其中的所有内容。 - Alyoshak
我不得不将我的设置为YES才能使它滚动。 - Chris

0
如果您正在尝试使用IB设置此项,请确保您的UIScrollView的高度属性设置为低于contentView的高度属性。例如,如果您将contentView的高度设置为810个点,则请确保将UIScrollView的高度设置为大约610个点或更低的值。

0

滚动视图的内容大小应该大于滚动视图的宽度和高度
要做到这一点 -

    scrollView.contentSize = CGSizeMake(originalImageSize.width,originalImageSize.height);

我认为这会有帮助。


如果你想要滚动条滚动,内容大小应该大于框架大小,否则它不允许滚动。 - user1079903

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接