Ваша проблема заключается в следующем:
pic2.topAnchor.constraint(equalTo: pic.bottomAnchor, constant : 0)
Вы говорите макету, чтобы верхняя часть вашей pic2
фигуры соответствовала нижней части вашей pic
фигуры.
Чтобы исправить это, ограничьте pic2
верхним безопасным пространством, затем высоту pic
в качестве константы, чтобы поставить вершину pic2
непосредственно под pic
.
pic2.topAnchor.constraint(equalTo: view.topAnchor, constant : pic.bounds.height)
Редактировать: pic.bounds.height
не будет загружаться, поскольку вы одновременно загружаете ограничения в viewDidLoad, а ViewController еще не заложил подпредставления, поэтому ваш pic
равен нулю, когда pic.bounds.height
называется. Чтобы решить эту проблему, вам необходимо выполнить следующие действия:
• Изолировать инициализацию pi c в viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
pic.isUserInteractionEnabled = true
g2 = UIPanGestureRecognizer(target: self, action: #selector(ViewController.g1Method))
pic.addGestureRecognizer(g2)
pic.backgroundColor = .systemGreen
pic2.backgroundColor = .green
picWidth = pic.widthAnchor.constraint(equalTo: view.widthAnchor ,multiplier: 0.2)
picHeight = pic.heightAnchor.constraint(equalTo: view.heightAnchor ,multiplier: 0.20)
[pic,pic2,slider].forEach {
view.addSubview($0)
$0.translatesAutoresizingMaskIntoConstraints = false
}
NSLayoutConstraint.activate([pic.topAnchor.constraint(equalTo: view.topAnchor, constant : 0),
picWidth,
picHeight,
pic.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant :0)])
slider.addTarget(self, action: #selector(hhh), for: .allEvents)
}
• Бросить оставшиеся части в viewDidLayoutSubviews:
override func viewDidLayoutSubviews() {
NSLayoutConstraint.activate ([
pic2.topAnchor.constraint(equalTo: view.topAnchor, constant : pic.bounds.height),
pic2.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.5, constant: 0),
pic2.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.4, constant: 0),
pic2.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant : 0),
slider.topAnchor.constraint(equalTo: pic2.bottomAnchor, constant : 0),
slider.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.20, constant: 0),
slider.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.20, constant: 0),
slider.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant : 0),
])
}
Как примечание стороны, ползунок все еще будет испорчен, если вы заставите светло-зеленый квадрат двигаться, потому что вы ограничиваете его квадратом. Попытайтесь войти в шаблон создания ваших ограничений для объекта, расположенного на внешних частях экрана, на основе якорей представления, а не других элементов пользовательского интерфейса.