iOS - UIScrollView不工作(它根本不滚动 - 图像保持固定)

时间:2012-03-14 13:00:36

标签: iphone ios5 uiscrollview uiimageview

我想在图片视图中显示图片(宽度:320像素,高度:1250像素)。

当我编译应用程序时,我根本没有滚动。视图保持不变。

我做了什么:

  1. 通过Interface Builder添加UIScrollView到我的视图。
  2. 通过Interface Builder在我的视图中添加了UIImageView
  3. 已验证Interface Builder中的UIImageView低于UIScrollView
  4. 使用UIScrollView设置ViewDidLoad的尺寸。
  5. 我该怎么做?

    代码:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        scrollView.contentSize = CGSizeMake(320, 1250);
    }
    

    截图:

    ImageView

    Enter image description here

    ScrollView

    Enter image description here Enter image description here

    Enter image description here

17 个答案:

答案 0 :(得分:27)

我刚刚完成了同样的任务.. 试试这个......

scrollView.delegate = self;
scrollView.scrollEnabled = YES;

int scrollWidth = 120;
scrollView.contentSize = CGSizeMake(scrollWidth,80);     


int xOffset = 0;
imageView.image = [UIImage imageNamed:[imagesName objectAtIndex:0]];

for(int index=0; index < [imagesName count]; index++)
{       
    UIImageView *img = [[UIImageView alloc] init];
    img.bounds = CGRectMake(10, 10, 50, 50);
    img.frame = CGRectMake(5+xOffset, 0, 50, 50);
    NSLog(@"image: %@",[imagesName objectAtIndex:index]);
    img.image = [UIImage imageNamed:[imagesName objectAtIndex:index]];
    [images insertObject:img atIndex:index];         
    scrollView.contentSize = CGSizeMake(scrollWidth+xOffset,110); 
    [scrollView addSubview:[images objectAtIndex:index]];

    xOffset += 70;
}

同时设置这个......

imagesName = [[NSArray alloc]initWithObjects:@"image1.jpg",@"image2.jpg",@"image3.jpg",@"image4.jpg",@"image5.jpg",@"image6.png",@"image7.png",@"image9.png",nil];
    images = [[NSMutableArray alloc]init];

答案 1 :(得分:26)

所以对我来说问题是设置内容大小在viewDidLoad()中不起作用。我尝试了一切,我不明白为什么它不想工作,然后我在viewDidAppear()尝试了同样的东西,它神奇地工作了......

答案 2 :(得分:10)

从你的最后一个截图和你的评论看起来你的scrollView是大的。 滚动视图必须完全在屏幕上可见。例如,iPhone上的全屏UIScrollView的大小为320 x 460。

如果滚动视图的大小与其内容相同,则无法滚动。

绿色矩形显示滚动视图的大小,粉红色的内容大小(您的图像):

enter image description here

答案 3 :(得分:6)

我发现我遇到了类似的问题,但上述代码均无效。问题是由于自动布局。我发现,如果我通过单击“实用工具”转到故事板关闭自动布局 - >文件检查器未经检查Use Autolayout滚动确实有效(我还设置了scroll.contentSize = ...)。

答案 4 :(得分:6)

我在iOS6上遇到了同样的问题,解决方案是以编程方式调整 ContentSize 。 所以我将引用Raja(上图)来说明这一点:

CGSize scrollViewContentSize = CGSizeMake(320, 400);
[self.scrollView setContentSize:scrollViewContentSize];

注意:我在iOS5上没有这个问题..似乎iOS6决定做很多恶作剧就像旋转/定位传奇一样

答案 5 :(得分:6)

从Xcode 5开始,它不像以前那样工作。滚动到可滚动文本字段的末尾也会产生问题。在iPhone或iPad上进行此操作也存在差异。在iPhone上它没有延迟计时器。

这对我有用:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSTimer *timerforScrollView;
    timerforScrollView =[NSTimer scheduledTimerWithTimeInterval:0.1
           target:self selector:@selector(forScrollView)userInfo:nil repeats:NO];   
}

- (void) forScrollView {
    [scrollviewPad setScrollEnabled:YES];
    [scrollviewPad setContentSize:CGSizeMake(768, 1015)]; // must be greater then the size in Storyboard
}

答案 6 :(得分:4)

Swift 4,iOS 11

使用autolayout的最简单方法:

  1. 添加UIScrollView并将其固定为superview(或您想要的大小)0,0,0,0
  2. 在ScrollView中添加UIView,将它0,0,0,0固定到所有4个边并将其水平和垂直居中。
  3. 在尺寸检查员中,更改&#39;底部&#39;并且&#39;对齐中心Y&#39;优先考虑250。
  4. 将您需要的所有视图添加到此视图中。 不要忘记在最低视图上设置底部约束。

答案 7 :(得分:3)

不要忘记将类别协议添加到界面,如此

@interface MyViewController : <UIScrollViewDelegate>

如果不这样做,您将无法将滚动视图委托设置为自我

(即[MyScrollView setDelegate:self];

如果你这样做,它应该有效。

我的代码是:

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [contentScrollView setDelegate:self];
    [contentScrollView setScrollEnabled:YES];
    contentScrollView.contentSize = CGSizeMake(310, 500);
    contentScrollView.frame = CGRectMake(5, 188, 310, 193);
}

答案 8 :(得分:3)

有时在xib中勾选autoLayout复选框。这也在xcode 5中创建了这个问题。这使得UIScrollView滚动。

答案 9 :(得分:2)

您是否指定了滚动的视图委托?永远记住这些:

[self.scrollView setDelegate:self]; 
[self.scrollView setScrollEnabled:YES];

答案 10 :(得分:1)

你忘了一行。将其添加到视图加载函数:

[scrollView setScrollEnabled:YES];

答案 11 :(得分:1)

您可以尝试禁用AutoLayout。在XCode 5中,我测试了上述所有答案,我只能通过禁用自动布局并激活尺寸检查器下的所有自动调整遮罩来滚动它。还使用了以下代码:

self.scrollView.contentSize = CGSizeMake(320, 900);
self.scrollView.delegate = self;
self.scrollView.scrollEnabled = YES;
self.scrollView.frame = self.view.frame;

答案 12 :(得分:1)

图像视图必须是滚动视图的子视图(内部和下部)。根据你的描述,它们似乎是并列的

答案 13 :(得分:0)

假设scrollView是视图的子视图并完全填充它,您可以在viewDidLoad中使用以下内容:

  [scrollView setContentSize: CGSizeMake(self.view.frame.size.width, self.view.frame.size.height)];

我有一个没有滚动的UIScrollView,这允许它滚动。

答案 14 :(得分:0)

CGRect scrollViewFrame = CGRectMake(0, 0, 320, 400);
self.scrollView = [[UIScrollView alloc] initWithFrame:scrollViewFrame];

[self.view addSubview:self.scrollView];
CGSize scrollViewContentSize = CGSizeMake(320, 400);
[self.scrollView setContentSize:scrollViewContentSize];
scrollView.delegate = self;

[self.scrollView setBackgroundColor:[UIColor blackColor]];
[scrollView setCanCancelContentTouches:NO];

scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
scrollView.clipsToBounds = YES;
scrollView.scrollEnabled = YES;
scrollView.pagingEnabled = YES;

NSUInteger nimages = 0;
CGFloat cx = 0;
for (; ; nimages++) {
    NSString *imageName = [NSString stringWithFormat:@"image%d.jpg", (nimages + 1)];
    UIImage *image = [UIImage imageNamed:imageName];
    if (image == nil) {
        break;
    }
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

    CGRect rect = imageView.frame;
    rect.size.height = image.size.height;
    rect.size.width = image.size.width;
    rect.origin.x = ((scrollView.frame.size.width - image.size.width) / 2) + cx;
    rect.origin.y = ((scrollView.frame.size.height - image.size.height) / 2);

    imageView.frame = rect;

    [scrollView addSubview:imageView];
    [imageView release];

    cx += scrollView.frame.size.width;
}


[scrollView setContentSize:CGSizeMake(cx, [scrollView bounds].size.height)];

答案 15 :(得分:0)

我有同样的问题,正在寻找这个帖子中的答案。我尝试了所有的东西,但没有任何作用。然后我发现了这个:

deselect Use Auto Layout

您只需在ViewController的文件检查器中取消选择“使用自动布局”即可。 Ta-Da,它立即为我工作。请享用。

答案 16 :(得分:0)

只需添加代码

scrollView.contentSize = CGSizeMake(WIDTH,HEIGHT);

方法 - (void)viewDidLayoutSubviews 。   有关更多信息,请查看Stanford CS193p第8讲,了解View Controller生命周期。