ScrollView Autolayout 使用标签但不使用自定义控件
Posted
技术标签:
【中文标题】ScrollView Autolayout 使用标签但不使用自定义控件【英文标题】:ScrollView Autolayout working with Label but not Custom Control 【发布时间】:2017-08-02 11:37:02 【问题描述】:我正在开发一个在 UIScrollView 中具有自定义分段控件的项目。我想使用自动布局来定位分段控件。我正在使用这个项目作为我的模型:https://github.com/honghaoz/UIScrollView-and-AutoLayout
import UIKit
class ViewController: UIViewController
let scrollView = UIScrollView()
var screenBounds: CGRect return UIScreen.main.bounds
override var preferredStatusBarStyle : UIStatusBarStyle
return .lightContent
override func viewDidLoad()
super.viewDidLoad()
// Setup scroll view
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.backgroundColor = UIColor(red:20/255.0, green:119/255.0, blue:61/255.0, alpha:255/255.0)
view.addSubview(scrollView)
// Setup constraints
var views: [String: UIView] = [
"scrollView": scrollView
]
var constraints = [NSLayoutConstraint]()
// External constraints
constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[scrollView]|", options: [], metrics: nil, views: views)
constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|[scrollView]|", options: [], metrics: nil, views: views)
// Internal constraints
// Note: to let scrollView determines its contentSize, four edges should be explicitly specified
let v1 = newLabelWithText("v1 v1 v1 v1 v1 v1 v1 v1 v1 v1")
scrollView.addSubview(v1)
views["v1"] = v1
//Create Segmented Control
let segmentedB = YSSegmentedControl(
//Set Frame in Callback (Required)
frame: CGRect(x: 0, y: 0, width: 400, height: 60),
titles: [
"Yes",
"No"
],
action:
control, index in
print ("segmented did pressed \(index)")
)
scrollView.addSubview(segmentedB)
views["v4"] = segmentedB
let v2 = newLabelWithText("v2 v2 v2 v2 v2")
views["v2"] = v2
let v3 = newLabelWithText("v3 v3 v3 v3 v3")
views["v3"] = v3
scrollView.addSubview(v3)
// Horizontal, fully specified
constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|-200-[v4]-300-|", options: .alignAllLastBaseline, metrics: nil, views: views)
// Vertically, fully specified
constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-200-[v3]-1000-|", options: .alignAllLeading, metrics: nil, views: views)
NSLayoutConstraint.activate(constraints)
print("scrollView.contentSize: \(scrollView.contentSize)")
出于某种原因,自动布局适用于文本标签,但不适用于分段控件。回调要求我为 CGRect 输入参数,因此我只需设置宽度和高度并将位置参数保持为零。这在没有滚动视图时有效,但现在不起作用。
另外,我没有在这个项目中使用故事板。所有约束和视图都是以编程方式创建的。
任何帮助表示赞赏。谢谢
【问题讨论】:
【参考方案1】:我认为你应该在添加约束之前添加这一行
segmentedB.translatesAutoresizingMaskIntoConstraints = false
每当您以编程方式添加约束时,都应将此属性设置为 false 以使约束在视图上生效
【讨论】:
以上是关于ScrollView Autolayout 使用标签但不使用自定义控件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Xcode 6.3 中使用 AutoLayout 创建 ScrollView
如何在StoryBoardxib上使用AutoLayout+ScrollView
如何使用AutoLayout(iOS / Xamarin.iOS)使ScrollView适合其内容?
使用 ScrollView 时出现 Autolayout 和 StackView 的问题