【问题标题】:Change view with Segment View Control使用分段视图控件更改视图
【发布时间】:2020-03-31 13:23:54
【问题描述】:

我在我的视图控制器中创建了一个视图,它具有 UISegmentControl 和一个 UIScrollView

let segmentControl : UISegmentedControl = {
    let segmentItems = ["Personal","Statistics","Calendar"]
    let segmentControl = UISegmentedControl(items: segmentItems)
    segmentControl.selectedSegmentIndex = 0
    segmentControl.addTarget(self, action: #selector(selectIn(sender:)), for: .valueChanged)
    segmentControl.translatesAutoresizingMaskIntoConstraints = false
    return segmentControl
}()

let subView : UIScrollView = {
    let view = UIScrollView()
    view.backgroundColor = .red
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}()

在 viewDidLoad 我添加了

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.isHidden = true

    view.addSubview(segmentControl)
    view.addSubview(subView)
    setLayout()
}

并添加如下布局

func setLayout(){
    NSLayoutConstraint.activate([
        segmentControl.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 10),
        segmentControl.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 20),
        segmentControl.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -20),
        segmentControl.heightAnchor.constraint(equalToConstant: 30),

        subView.topAnchor.constraint(equalTo: segmentControl.bottomAnchor, constant: 10),
        subView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 20),
        subView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -20),
        subView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
    ])
}

并尝试在按下任何 segmentControl 时添加 PersonalView (UIView)

@objc func selectIn(sender: UISegmentedControl){
        subView.addSubview(pvc)
}

我的个人看法如下

class PersonalView: UIView, UICollectionViewDelegate, UICollectionViewDataSource, UITableViewDelegate, UITableViewDataSource {

let tempValueForTable : Int = 10

let todayLabel : UILabel = {
    let label = UILabel()
    label.text = "Today"
    label.font = .montserratSemiBold
    label.textAlignment = .center
    label.backgroundColor = .green
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

override init(frame: CGRect) {
    super.init(frame: frame)

    addSubview(todayLabel)
    setLayout()

}

private func setLayout(){
    NSLayoutConstraint.activate([
        todayLabel.topAnchor.constraint(equalTo: self.topAnchor),
        todayLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 20),
        todayLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -20),
        todayLabel.heightAnchor.constraint(equalToConstant: 25),
    ])
}

required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}}

我仍然无法获得视图,并且在进一步更新中我需要在同一 ScrollView

中添加更多视图

【问题讨论】:

  • 您是否忘记在 pvc 上添加有关其 superview 的约束?

标签: swift uiview uiviewcontroller uisegmentedcontrol


【解决方案1】:

1.当您使用自动布局约束时,您必须在添加后将此设置为 false。

SomeView.translatesAutoresizingMaskIntoConstraints = false

2.添加子视图后,您必须设置其约束并调用 view.layoutIfNeeded()

subView.addSubview(pvc)
pvc.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
     pvc.trailingAnchor.constraint(equalTo: subView.trailingAnchor),
     pvc.leadingAnchor.constraint(equalTo: subView.leadingAnchor),
     pvc.topAnchor.constraint(equalTo: subView.topAnchor),
     pvc.bottomAnchor.constraint(equalTo: subView.bottomAnchor),
])
view.layoutIfNeeded()

【讨论】:

  • 谢谢它的工作我仍然需要添加pvc.widthAnchor.constraint(equalTo: subView.widthAnchor) 以便我可以根据需要获得相同的宽度
猜你喜欢
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多