Изменить вид с помощью элемента управления представлением сегмента - PullRequest
0 голосов
/ 31 марта 2020

Я создал представление в моем контроллере View, которое имеет 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),
    ])
}

и попытался добавить PersonalView (UIView) при нажатии любого сегмента ControlControl

@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

1 Ответ

0 голосов
/ 31 марта 2020

1. Когда вы используете ограничения автоматического макета, вы должны установить это ложное значение после добавления.

SomeView.translatesAutoresizingMaskIntoConstraints = false

2. После добавления вашего subView вы должны установить его ограничения и вызвать 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()
...