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 的问题

使用 AutoLayout 以编程方式将 UILabel 添加到 ScrollView (swift)

如何使用 AutoLayout (iOS/Xamarin.iOS) 使 ScrollView 适合其内容?