iOS 10问题:UIScrollView无法滚动,即使设置了ContentSize

4
更新: 这是iOS 10的问题。在iOS 9中,这仍然像以前一样工作。
这很有趣。
我刚刚将我的“教学项目”(一个“玩具”应用程序)转换为Swift 3。它在Swift 1.2下工作了几年。
突然间,即使我将contentSize设置得远远超出其下边界,我的UIScrollView也无法滚动。
以下是相关代码(displayTags例程被调用时,使用一个图像数组进行显示,这些图像居中并略微垂直偏移,从而形成一个垂直链):
    /*******************************************************************************************/
    /**
        \brief  Displays the tags in the scroll view.

        \param inTagImageArray the array of tag images to be displayed.
    */
    func displayTags ( inTagImageArray:[UIImage] )
    {
        self.tagDisplayView!.bounds = self.tagDisplayScroller!.bounds
        if ( inTagImageArray.count > 0 )    // We need to have images to display
        {
            var offset:CGFloat = 0.0    // This will be the vertical offset for each tag.

            for tag in inTagImageArray
            {
                self.displayTag ( inTag: tag, inOffset: &offset )
            }
        }
    }
    /*******************************************************************************************/
    /**
        \brief  Displays a single tag in the scroll view.

        \param inTag a UIImage of the tag to be displayed.
        \param inOffset the vertical offset (from the top of the display view) of the tag to be drawn.
    */
    func displayTag ( inTag:UIImage, inOffset:inout CGFloat )
    {
        let imageView:UIImageView = UIImageView ( image:inTag )
        var containerRect:CGRect = self.tagDisplayView!.frame   // See what we have to work with.
        containerRect.origin = CGPoint.zero
        let targetRect:CGRect = CGRect ( x: (containerRect.size.width - inTag.size.width) / 2.0, y: inOffset, width: inTag.size.width, height: inTag.size.height )
        imageView.frame = targetRect
        containerRect.size.height = max ( (targetRect.origin.y + targetRect.size.height), (containerRect.origin.y + containerRect.size.height) )
        self.tagDisplayView!.frame = containerRect
        self.tagDisplayView!.addSubview ( imageView )
        self.tagDisplayScroller!.contentSize = containerRect.size
        print ( "Tag Container Rect: \(containerRect)" )
        print ( "    Tag ScrollView Bounds: \(self.tagDisplayScroller!.bounds)" )
        inOffset = inOffset + (inTag.size.height * 0.31)
    }

请注意,每次添加标签时,scrollView的contentSize会扩展。我检查过(请参见打印语句),该值似乎是正确的。 该项目本身完全开源。 这就是问题出现的地方(我还有其他错误,但是我会在解决这个问题后解决它们)。
我相信我正在做一些显而易见和愚蠢的事情(通常情况下)。你有什么想法吗?

我认为问题出在 uiview 上,你没有设置高度。 - Do2
我会去检查一下。高度在Storyboard中设置(并在构建时删除),但我没有在这里设置它。你说的完全有可能是正确的。我发现未记录(或未明确说明)的事情经常在操作系统升级中发生变化。我只在iOS 10中测试过这个问题。我想知道它是否还能在iOS 9中工作?如果是这样,我还有另一个应用程序需要调整。谢谢! - Chris Marshall
好的,我刚刚检查了一下。在9.3中可以工作,但在10中不行。操作系统引入了一个曲线球。高度正在被设置(请注意我设置了框架)。我需要弄清楚为什么iOS 10突然不喜欢这个。我在另一个应用程序中几乎完全做同样的事情,所以我有点担心。 - Chris Marshall
如果我是你,我会删除那个视图控制器并重新开始,为你的UIView设置明确的高度,看看效果如何。 - Do2
是的,我想我会重新构建整个视图。这很奇怪。苹果提供的示例应用程序是:1)使用ObjC(而不是Swift),2)正好做我正在做的事情。 - Chris Marshall
显示剩余3条评论
3个回答

12

当你在主线程上设置contentSize并将此代码放入- (void)viewDidLayoutSubviews中时,它将起作用。

- (void)viewDidLayoutSubviews
{
    dispatch_async (dispatch_get_main_queue(), ^
                    {
                        [self.scrollview setContentSize:CGSizeMake(0, 2100)];
                    });
}

谢谢,我很感激你的提示,并给予了赞同。不幸的是,虽然完全正确,但它并不是解决方案。问题在于iOS 10突然开始将滚动视图固定到容器上,如果存在顶部和前导约束条件。我已经在构建时删除了这些约束,问题得以解决。再次感谢。 - Chris Marshall

8

在Swift中,contentSize应该在主线程中更改。

DispatchQueue.main.async {
        self.scrollView.contentSize = CGSize(width: 2000, height: 2000)
    }

这对我很有效。

这对我来说是有效的.. 这绝对荒谬,从viewDidAppear中无法工作 - quantumpotato
这对我也起作用了。我必须提到的一件事是,似乎在iPad上行为不同,因为在UI线程上设置contentSize可以正常工作。 - Vahid Amiri

4

好的,我解决了。

我在构建时删除了内部(滚动)视图的每个自动布局约束。

我假设iOS 10终于遵守合同,强制将滚动视图的顶部附加到滚动条的顶部,即使用户想移动它。


你在运行时移除了所有的约束并且成功了吗?我遇到了同样的问题,只不过是在使用Xamarin时,在升级到IOS 10后,我的UIScrollView不再具有高度。我可以为我的直接子视图设置垂直对齐,并且它会显示出来,但是无法滚动。在ViewDidLoad中移除约束似乎没有任何影响。 - JoeCo
1
说实话,我还没有完全弄清楚这个。在那种情况下对我有用。然而,在其他情况下,我使用经典结构,它也有效。我需要花些时间尝试一些东西。 - Chris Marshall
我创建了一个演示Swift项目来测试它。这个项目展示了它的运作方式。但你的结果可能会有所不同。 - Chris Marshall
最终我的问题似乎是与Xamarin有关的,当最初设置xib时,由于某种原因,在xCode选项中“在构建时删除”被选中了我的尾部和底部约束。看起来Xamarin最终遵循了该设置。 - JoeCo
很高兴你能解决它。我发现使用UITableView通常会使这种事情变得更容易。这个项目仍然非常初级,但展示了我如何使用UITableView进行复杂的UI布局(我编写了一个测试程序)。 - Chris Marshall

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