【问题标题】:iOS - UIScrollView is not working (it doesn't scroll at all - the image stays fixed)iOS - UIScrollView 不工作(它根本不滚动 - 图像保持固定)
【发布时间】:2012-03-14 13:00:35
【问题描述】:

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

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

我做了什么:

  1. 通过Interface Builder 在我的视图中添加了UIScrollView
  2. 通过 Interface Builder 在我的视图中添加了 UIImageView
  3. 在 Interface Builder 中验证 UIImageView 低于 UIScrollView
  4. ViewDidLoad设置UIScrollView的大小。

我该怎么做?

代码:

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

截图:

ImageView:

ScrollView:

【问题讨论】:

  • 为什么你的滚动视图的尺寸是 320 x 1294?如果您的滚动视图与其内容的大小相同,则它不会滚动。
  • 我的错,实际上应该是 320x1250。所以滚动视图必须比我要显示的图像略大?会试试的。
  • 不起作用,现在图像有 300x1000(滚动视图仍然有 320x1250)但我没有滚动。
  • 不。滚动视图必须更小。它必须在屏幕上完全可见。如果你想要一个大小为 320x460 的全屏滚动视图
  • 信息:我刚刚在 Xcode 中创建了一个新项目并做了我之前做过的事情,但是当我添加工具栏时滚动工作会被禁用。我是否必须在代码中以某种方式对工具栏添加做出反应?

标签: iphone ios5 uiscrollview uiimageview


【解决方案1】:

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

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];

【讨论】:

  • 如果你不在 ARC 环境中,这段代码将会泄漏,因为你正在为 UIImageView *img = [[UIImageView alloc] init]; 分配内存,但你永远不会释放它。如果你有很多图像,我宁愿建议在每次迭代结束之前释放它,而不是自动释放它,因为你永远不知道运行时何时会自动释放它们。
  • Alex:在循环结束时手动释放的建议对非 ARC 代码有好处。不过有一件事,如果您使用自动释放,我们确实知道运行时何时会释放图像。它总是在事件循环结束时发生。这是引用计数,而不是垃圾回收。
  • 这是我缺少的部分:scrollView.contentSize = CGSizeMake(scrollWidth,80); conentSize 必须大于 scrollView 的帧大小。
  • 不确定为什么这是被接受的答案,因为 OP 询问显示单个图像。无论如何,关键是 scrollView.contentSize 需要大于 scrollViews 框架。
【解决方案2】:

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

【讨论】:

  • 这也对我有用,是一个非常简单的解决方案。然而,Apple 需要让它“正常工作”,因为添加滚动视图是一种常见的操作,不需要任何大惊小怪,因为它不需要。谢谢!
  • 我不确定您是如何设置scrollView,但最常见的此类错误原因是在Interface Builder(XIB 或情节提要)中设置的出口没有在@987654324 之前设置@。您可能正在调用 nil 对象的 setter。
【解决方案3】:

从您上次的屏幕截图和您的 cmets 来看,您的 scrollView 看起来很大。 滚动视图必须在屏幕上完全可见。例如,iPhone 上的全屏 UIScrollView 的大小为 320 x 460。

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

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

【讨论】:

  • 谢谢,不知道 ScrollView 不能大于 iPhone 屏幕。现在很清楚,但我仍然想知道为什么它适用于我刚刚创建的另一个项目(但当我添加工具栏时停止滚动)
【解决方案4】:

Xcode 11+、Swift 5

您可以找到完整的解决方案here

【讨论】:

  • 还是不能滚动
  • @Shakti,仔细检查你是否在“最低”/最后一个视图上添加了底部约束,如果没有这个约束,它将无法工作。
  • 谢谢人,它确实有效,我忘了添加 4 点指令
【解决方案5】:

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

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

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

【讨论】:

  • 如果使用第一个,size 的第二个值需要大于在 Storyboard 中签名的那个。否则不滚动
【解决方案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
}

【讨论】:

  • @NoraAlnashwan 我有一个类似的问题,即设置 contentSize 根本没有更新滚动视图。这个答案让我走上了正确的道路,那就是把它放在DispatchQueue.main.async { }
【解决方案7】:

我发现我遇到了类似的问题,但上面的代码都没有工作。问题是由于自动布局。我发现,如果我通过转到情节提要单击实用程序 -> 文件检查器并取消选中 Use Autolayout 来关闭自动布局,则滚动确实有效(我还设置了 scroll.contentSize = ...)。

【讨论】:

    【解决方案8】:

    有时会在 xib 中勾选 autoLayout 复选框。这也在 xcode 5 中产生了这个问题。这使得 UIScrollView 滚动关闭。

    【讨论】:

      【解决方案9】:

      不要忘记在接口中添加category协议,像这样

      @interface MyViewController : <UIScrollViewDelegate>
      

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

      (即[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);
      }
      

      【讨论】:

      • UIScrollViewDelegate 不是一个类别,而是一个协议。
      【解决方案10】:

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

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

      【讨论】:

      • 是的,我是在 InterfaceBuilder 中完成的。 (只是尝试在 ViewDidLoad 中进行编程并首先删除 IB 中的连接,但问题仍然存在。)
      【解决方案11】:

      图像视图必须是滚动视图的子视图(因此在内部和下方)。从你的描述看来它们是平行的

      【讨论】:

      • 我想我做得对,你能看看新的截图吗?顶部是视图,滚动视图下方,图像视图下方。我错了吗?
      【解决方案12】:

      你忘记了一行。将此添加到您的视图加载函数中:

      [scrollView setScrollEnabled:YES];
      

      【讨论】:

      • 不幸的是,这并没有解决它。添加了行但仍然无法滚动,
      • 也许你应该作为测试添加一个标签进入滚动视图,看看它是如何进行的。如果您需要更多帮助,我可以一起为您完成一个 xCode 4 项目...
      • 当我删除图像视图并直接在滚动视图上使用标签时也不起作用。嗯...如果你有一个 Xcode 项目可以方便地做我想在这里完成的事情,我很乐意看看它。
      • 你可以在storyBoard中看到他已经检查过了。
      【解决方案13】:

      您可以尝试禁用自动布局。在 XCode 5 中,我测试了上述所有答案,我只能通过禁用自动布局并激活 Size Inspector 下的所有自动调整大小的蒙版来滚动它。也使用了以下代码:

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

      【讨论】:

        【解决方案14】:
        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】:

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

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

          我有一个不滚动的 UIScrollView,这让它可以滚动。

          【讨论】:

            【解决方案16】:

            只需添加代码

            scrollView.contentSize = CGSizeMake(WIDTH,HEIGHT);
            

            到方法 -(void)viewDidLayoutSubviews。 欲了解更多信息,请查看斯坦福 CS193p 第 8 期讲座以了解 View Controller 生命周期。

            【讨论】:

              【解决方案17】:

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

              .

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-04-05
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多