Добавьте layoutMargins к одному элементу в UIStackView - PullRequest
1 голос
/ 31 марта 2019

Я хотел бы создать вертикальный стек с 3-мя элементами.Я хочу немного больше места только между 2-м и последним элементом.Поэтому я подумал о добавлении к последнему элементу:

mylastelement.layoutMargins = UIEdgeInsets(top:30, left:0,bottom:0, right:0)

Но макеты компоновки не применяются в моем стековом представлении.Есть ли простой способ добиться этого (я хотел бы избежать изменения внутренней высоты последнего элемента).

РЕДАКТИРОВАТЬ: Я просто попытался увеличить высоту 2-го элемента (+50) в его кадре, выполнив:

my2ndElementLabel.sizeToFit()
my2ndElementLabel.frame = CGRect(x:my2ndElementLabel.frame.origin.x,y:lmy2ndElementLabel.frame.origin.y,
                                 width:my2ndElementLabel.frame.width, height:my2ndElementLabel.frame.height + 50)

но это не имеет никакого эффекта.

EDIT2: я пытался добавить случайное представление в мой UIStackView, но представление просто игнорируется!Может быть, что-то упустил в понимании того, как работает UIKit? ...:

let v = UIView(frame:CGRect(x:0,y:0,width:100,height:400))
v.backgroundColor = .red
myStackView.addArrangedSubview(v)
//...

Ответы [ 3 ]

1 голос
/ 31 марта 2019

В том же духе вы можете ограничить верхнюю (или нижнюю) привязку своего вида относительно соответствующего края любого вида, в который он встроен. То, что некрасиво - это дело вкуса, я считаю, что ограничения автопоставки просты в использовании и легко рассуждаются.

Простой пример с Mac OS, а не с iOS:

        let button = ControlFactory.labeledButton("Filter")
        addSubview(button)
        button.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -20).isActive = true
        button.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true

Этот конкретный код находится в инициализаторе представления и размещает кнопку в середине представления, на 20 точек вверх от дна.

0 голосов
/ 14 апреля 2019

Вот расширение, которое я сделал, чтобы быстро достичь таких полей:

extension UIStackView {

    func addArrangedSubview(_ v:UIView, withMargin m:UIEdgeInsets )
    {
        let containerForMargin = UIView()
        containerForMargin.addSubview(v)
        v.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            v.topAnchor.constraint(equalTo: containerForMargin.topAnchor, constant:m.top ),
            v.bottomAnchor.constraint(equalTo: containerForMargin.bottomAnchor, constant: m.bottom ),
            v.leftAnchor.constraint(equalTo: containerForMargin.leftAnchor, constant: m.left),
            v.rightAnchor.constraint(equalTo: containerForMargin.rightAnchor, constant: m.right)
        ])

        addArrangedSubview(containerForMargin)
    }
}
0 голосов
/ 31 марта 2019

Я нашел себя: похоже, UIStackView вообще не работает со старой системой определения размеров (с .frame).Кажется, вам нужно ограничить высоту и ширину, и StackView будет ограничивать левую / верхнюю / правую / нижнюю позиции для вас, когда вы добавите организованный вид.

Моим вторым видом была метка: я хотел, чтобы поле под текстом было 40.Поэтому я сначала вычислил высоту метки в ее свойстве .frame и ограничил высоту в frame.height + 40 (= мое поле)

labelDesc.sizeToFit()
labelDesc.heightAnchor.constraint(equalToConstant:40).isActive = true

Хотя я считаю, что мое собственное решение совершенно безобразно.Я уверен, что UIKit обеспечит лучший способ для достижения такой простой цели, не делая такого рода DIY-решения.Поэтому, пожалуйста, если вы привыкли работать с UIKit, скажите мне, если есть какое-то лучшее решение.

...