【问题标题】:iOS 10 Issue: UIScrollView Not Scrolling, Even When ContentSize Is SetiOS 10 问题:UIScrollView 不滚动,即使设置了 ContentSize
【发布时间】:2017-01-26 09:36:36
【问题描述】:

更新:这是 iOS 10 的问题。这在 iOS 9 中仍然有效。

这……很有趣。

我刚刚将我的“教学项目”(一个“玩具”应用)转换为 Swift 3。

它在 Swift 1.2 下已经工作了几年。

突然之间,我的 UIScrollView 没有滚动,即使我将 contentSize 设置为超出了它的下边界。

以下是相关代码(调用 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)
    }

请注意,每次添加标签时都会扩展滚动视图的 contentSize。我检查了(见打印语句),值似乎是正确的。

The project itself is completely open-source.

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

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

有人有什么想法吗?

【问题讨论】:

  • 我认为问题出在uiview上,你没有设置高度..
  • 我去看看。高度在情节提要中设置(并在构建时删除),但我没有在此处设置。你完全有可能是对的。我发现未记录(或未明确说明)的事情经常在操作系统升级中发生变化。我只在 iOS 10 中对此进行了测试。我想知道它是否会在 iOS 9 中再次运行?如果是这样,我还有另一个需要调整的应用程序。谢谢!
  • 好吧,我刚刚检查过了。适用于 9.3,但不适用于 10。操作系统引入了曲线球。正在设置高度(请参阅我设置了框架)。我需要弄清楚为什么 iOS 10 突然不喜欢这个了。我在另一个应用程序中做几乎完全相同的事情,我很担心。
  • 我试图将它设置在我的最后,但它是不可能的。你的 UIView 应该有一个明确的高度。通过测试,我看到 4-5 个标签工作正常,并且它滚动,但如果你有 20 个,你将无法看到它们。所以这并不是说你的滚动视图不滚动..
  • 谢谢。我会继续戳它。就像我说的,它只在设备是 iOS 10 时发生,所以引擎盖下发生了一些变化。我以前在使用其他 SDK 时也发生过这种事情。

标签: ios iphone swift uiscrollview


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我很欣赏这个提示,并给了它一个大拇指。不幸的是,虽然绝对正确,但这不是解决方案。问题是,如果存在顶部和前导约束,iOS 10 突然开始将滚动视图固定到容器中。我在构建时删除了这些,并且解决了它。再次感谢。
【解决方案2】:

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

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

这对我有用。

【讨论】:

  • 这对我有用.. 这绝对是荒谬的,这在 viewDidAppear 中不起作用
  • 这也对我有用。我必须提到的一件事是,iPad 上的行为似乎有所不同,因为在 UI 线程上设置 contentSize 效果很好。
【解决方案3】:

好的。我解决了。

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

我假设 iOS 10 最终通过强制滚动视图的顶部附加到滚动条的顶部来履行合同,即使用户想要移动它。

【讨论】:

  • 您在运行时删除了所有约束并取得了成功?除了使用 Xamarin 之外,我看到了同样的问题,在升级到 IOS 10 后,我的 UIScrollView 不再有高度。我可以为我的直接子视图设置垂直对齐,它会显示但不允许滚动。删除 ViewDidLoad 中的约束似乎根本没有影响。
  • TBH,我还没有完全弄清楚这一点。在那种情况下,这对我有用。但是,在其他情况下,我使用经典结构并且它有效。我需要花一些时间尝试一下。
  • 我设置了一个演示 Swift 项目来测试这一点。 This project 展示了这一点。 YMMV
  • 最后我的问题似乎是 Xamarin 特有的,当最初设置 xib 时,由于某种原因,xCode 选项中的“在构建时删除”被检查了我的尾随和底部约束。看起来 Xamarin 终于遵循了该设置。
  • 很高兴您能够解决这个问题。我发现使用 UITableView 通常会使很多此类事情变得更容易。 This project 仍然非常绿色,但确实演示了我使用 UITableView 进行复杂的 UI 布局(我已经编写了一个测试程序)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 2020-11-22
  • 2011-11-02
  • 1970-01-01
相关资源
最近更新 更多