UIScrollView 内的水平 UIStackView 不滚动

Posted

技术标签:

【中文标题】UIScrollView 内的水平 UIStackView 不滚动【英文标题】:Horizontal UIStackView inside UIScrollView not scrolling 【发布时间】:2017-10-10 14:33:51 【问题描述】:

我在 UIScrollView 中有一个带有 3 个按钮的水平 UIStackView。当用户更改字体大小(通过辅助功能)时,我希望堆栈水平滚动。

现在,当用户增加字体大小时,其中一个按钮会被压扁。

这是我的限制:

【问题讨论】:

【参考方案1】:

滚动视图和右侧按钮之间的大于或等于约束似乎是问题所在。我将其更改为 Equal 并且有效。

【讨论】:

很高兴听到这个消息!干杯【参考方案2】:

确保 UIScrollView 的内容大小设置正确。以下是一些有用的参数。

scrollVIew.contentInset scrollVIew.scrollIndicatorInsets scrollView.contentSize

当内容视图高于滚动视图时,滚动视图启用垂直滚动。当内容视图比滚动视图宽时,滚动视图启用水平滚动。否则,默认情况下禁用滚动。您必须动态设置内容视图大小,以便当他们更改字体时,内容视图会比滚动视图宽度更宽。您可以将堆栈视图包装在另一个 UIViewController 中并将其视为内容视图。

【讨论】:

抱歉含糊不清。当内容视图高于滚动视图时,滚动视图启用垂直滚动。当内容视图比滚动视图宽时,滚动视图启用水平滚动。否则,默认情况下禁用滚动。您必须动态设置内容视图大小,以便当他们更改字体时,内容视图会比滚动视图宽度更宽。您可以将堆栈视图包装在另一个 UIViewController 中并将其视为内容视图。【参考方案3】:

试试这个在我这边工作得很好并且滚动得很好。

func createHorizontalStackViewWithScroll() 

 self.view.addSubview(stackScrollView)
 stackScrollView.translatesAutoresizingMaskIntoConstraints = false
 stackScrollView.heightAnchor.constraint(equalToConstant: 85).isActive = true
 stackScrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
 stackScrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
 stackScrollView.bottomAnchor.constraint(equalTo: visualEffectViews.topAnchor).isActive = true
 stackScrollView.addSubview(stackView)

 stackView.translatesAutoresizingMaskIntoConstraints = false
 stackView.topAnchor.constraint(equalTo: stackScrollView.topAnchor).isActive = true
 stackView.leadingAnchor.constraint(equalTo: stackScrollView.leadingAnchor).isActive = true
 stackView.trailingAnchor.constraint(equalTo: stackScrollView.trailingAnchor).isActive = true
 stackView.bottomAnchor.constraint(equalTo: stackScrollView.bottomAnchor).isActive = true
 stackView.heightAnchor.constraint(equalTo: stackScrollView.heightAnchor).isActive = true

 stackView.distribution = .equalSpacing
 stackView.spacing = 5
 stackView.axis = .horizontal
 stackView.alignment = .fill


 for i in 0 ..< images.count 
 let photoView = UIButton.init(frame: CGRect(x: 0, y: 0, width: 85, height: 85))
 // set button image
 photoView.translatesAutoresizingMaskIntoConstraints = false
 photoView.heightAnchor.constraint(equalToConstant: photoView.frame.height).isActive = true
 photoView.widthAnchor.constraint(equalToConstant: photoView.frame.width).isActive = true

 stackView.addArrangedSubview(photoView)
 
 stackView.setNeedsLayout()

 

【讨论】:

以上是关于UIScrollView 内的水平 UIStackView 不滚动的主要内容,如果未能解决你的问题,请参考以下文章

用于水平滚动的 UIScrollView 内的 UITableView 无法按预期工作

UIScrollView 内的 UITableViewController 与水平分页

分页 UIScrollView 内的 UIScrollView

UIScrollView 内的 CPTXYGraph

UIpageviewcontroller 内的 UIScrollview

UIScrollView 内的 UITextView