iOS 10问题:即使设置了ContentSize,UIScrollView也不会滚动

时间:2016-09-18 17:25:54

标签: ios iphone swift uiscrollview

更新: 这是iOS 10问题。这仍然像以前一样在iOS 9中运行。

这很有意思。

我刚刚转换了我的"教学项目" (a"玩具" app)到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。我检查了(见打印语句),值似乎是正确的。

The project itself is completely open-source.

This is where this issue manifests(我还有其他的错误,但在我指出这个错误之后我会解决它们。)

我确信我正在做一些明显和愚蠢的事情(通常是这种情况)。

有人有什么想法吗?

3 个答案:

答案 0 :(得分:12)

当您在主线程上设置contentSize并将此代码放入- (void)viewDidLayoutSubviews

时,它将起作用
- (void)viewDidLayoutSubviews
{
    dispatch_async (dispatch_get_main_queue(), ^
                    {
                        [self.scrollview setContentSize:CGSizeMake(0, 2100)];
                    });
}

答案 1 :(得分:7)

contentSize应该在swift的主线程中更改。

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

这对我有用。

答案 2 :(得分:4)

行。我解决了。

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

我认为iOS 10终于通过强制滚动视图的顶部附加到滚动条的顶部来表达合同,即使用户想要移动它。