在 UIScrollview 的末尾放置一个视图 - Swift

Posted

技术标签:

【中文标题】在 UIScrollview 的末尾放置一个视图 - Swift【英文标题】:Put a view at the end of UIScrollview - Swift 【发布时间】:2015-12-07 15:00:00 【问题描述】:

我的目标是在 UIScrollView 的末尾(右下角)设置一个 UIView。我看到了使用 UIContentSize 的解决方案,但我不想使用此属性,因为它不适合:UIView 宽度不等于 UIScrollview contentSize。

UIView 是 UIScrollView 的子视图,我只需要水平滚动。我想我必须使用约束才能将我的 UIView 粘贴在 UIscrollview 的末尾(这意味着 UIView 右侧与 UIScrollView 右侧相同,两者具有相同的高度)

我所做的是:

let horizontalConstraint = NSLayoutConstraint(item: self.myView , attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.myScrollView , attribute:  NSLayoutAttribute.Right, multiplier: 1, constant: 0)

self.myScrollView.addConstraint(horizontalConstraint)

let verticalConstraint = NSLayoutConstraint(item: self.myView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.myScrollView, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)

self.myScrollView.addConstraint(verticalConstraint)

我对如何设置此约束感到有些困惑和困惑,我可能错了,因为我的视图不再显示。我需要定义所有约束还是只定义一个用于右侧和一个用于顶部?有什么建议吗?谢谢

编辑: 我想要的解决方案可以这样表示:

【问题讨论】:

当你说 UIScrollView 的“结束”时,你的意思是它在滚动到底部时出现,还是停留在屏幕上浮动在 scrollView 上?我假设前者。所以myView 应该是myScrollView 的子视图。此外,您当前的垂直约束是固定在顶部,而不是底部。 嗨@Tim,当然 UIView 是 UIScrollview 的子视图;我想要的是,当用户启动应用程序时,它会在滚动视图的末尾显示 uiview,这对我来说意味着用户可以向左滚动但不能向右滚动(不管他多少/她可以向左滚动) 知道了,没有意识到你在水平滚动。您的scrollView 中还有什么内容?你说它没有出现,我猜它被掩盖了。无论 view 是其余的 scrollView 内容,都需要限制在 myView 的左边缘。 感谢您的回复@Tim,这是我的 UIScrollView 中包含的唯一视图。 【参考方案1】:

UIScrollView 从它的子视图中获取它的内容大小,所以它只会和它所包含的一样大。我们不能独立设置它的大小。一切都应该在子视图中。

决定你想要的myScrollView的大小:

let myViewWidth = myView.frame.width
let myViewHeight = myView.frame.height
let screenWidth = myScrollView.frame.width
let scrollContentWidth = myViewWidth + screenWidth

创建一个子视图,我们称之为widthView

let widthView = UIView(frame: CGFloat(x: 0, y: 0, width: scrollContentWidth, height: myViewHeight))
myScrollView.addSubview(widthView)

let leadingEdgeConstraint = NSLayoutConstraint(item: widthView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: myScrollView, attribute:  NSLayoutAttribute.Leading, multiplier: 1, constant: 0)
    myScrollView.addConstraint(leadingEdgeConstraint)

let trailingEdgeConstraint = NSLayoutConstraint(item: widthView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: myScrollView, attribute:  NSLayoutAttribute.Trailing, multiplier: 1, constant: 0)
    myScrollView.addConstraint(trailingEdgeConstraint)

let widthContainerConstraint = NSLayoutConstraint(item: widthView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: scrollContentWidth)
    myScrollView.addConstraint(widthContainerConstraint)

现在将您的 myView 添加到该视图中:

widthView.addSubview(myView)
myView.translatesAutoresizingMaskIntoConstraints = false

let horizontalConstraint = NSLayoutConstraint(item: myView , attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: widthView , attribute:  NSLayoutAttribute.Right, multiplier: 1, constant: 0)
    widthView.addConstraint(horizontalConstraint)

let heightConstraint = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: myViewHeight)
    widthView.addConstraint(heightConstraint)

let widthConstraint = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: myViewWidth)
    widthView.addConstraint(widthConstraint)

【讨论】:

而在我看来的解决方案是首先将子视图添加到 UIScrollView,然后设置约束(底部,左侧),然后更改 UIScrollview 的内容大小。对吗? 我想这可能会奏效。我不明白您为什么要允许向左滚动而没有任何内容的任何逻辑原因。滚动视图的目的是显示内容。 我快速绘制这个来向您展示问题(也在我的问题中更新)。右上角的指标指示条形图的值。这就是为什么我希望我的视图(包含图表)卡在右侧。绿色方块代表 UIScrollView,蓝色方块代表视图。 hpics.li/d459ecc 谢谢@Tim,contentSize 很好,但是 UIView 右侧没有卡在 UIScrollView 的末尾。。 如果您使用我建议的代码,请返回仅顶部和右侧约束,删除其他约束。【参考方案2】:

感谢@Tim 提供的信息,我终于在不使用另一个子视图的情况下解决了这个问题:

解决方案:

   // Create a view

    myView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: self.myScrollView.frame.height))
    myView.backgroundColor = UIColor.redColor()
    self.myScrollView.addSubview(myView)


    //  constraints

    myView.translatesAutoresizingMaskIntoConstraints = false


    let trailingSpaceConstraint = NSLayoutConstraint(item: self.myScrollView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: myView, attribute:  NSLayoutAttribute.Trailing, multiplier: 1, constant: 0)
    myScrollView.addConstraint(trailingSpaceConstraint)

    let screenWidth = self.view.frame.width
    let leadingSpaceConstraint = NSLayoutConstraint(item: self.myView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: self.myScrollView, attribute:  NSLayoutAttribute.Leading, multiplier: 1, constant: screenWidth - 15)
    myScrollView.addConstraint(leadingSpaceConstraint)



    let widthConstraint = NSLayoutConstraint(item: self.myView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute:  NSLayoutAttribute.Width, multiplier: 1, constant: 100)
    myScrollView.addConstraint(widthConstraint)

    let bottomConstraint = NSLayoutConstraint(item: self.myScrollView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.myView, attribute:  NSLayoutAttribute.Bottom, multiplier: 1, constant: 0) 
    myScrollView.addConstraint(bottomConstraint)


    let topConstraint = NSLayoutConstraint(item: self.myView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.myScrollView, attribute:  NSLayoutAttribute.Top, multiplier: 1, constant: 0)
    myScrollView.addConstraint(topConstraint)

    let heightConstraint = NSLayoutConstraint(item: self.myView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: self.myScrollView, attribute:  NSLayoutAttribute.Height, multiplier: 1, constant: 0)
    myScrollView.addConstraint(heightConstraint)

【讨论】:

以上是关于在 UIScrollview 的末尾放置一个视图 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

在带有约束的 UIScrollView 底部放置一个 UIButton

在具有动态高度的视图末尾添加一个 UIButton

如何在 UIScrollView 的滚动指示器下方放置非滚动 UIView?

iPhone:如何在捏缩放uiscrollview时重绘子视图

UIScrollView 不会滚动到子 UIStackView 的末尾

UIScrollView - 无法查看所有 UIView