2016-01-16 5 views
11

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

enter image description here

Пробовал играть с индексом Z, но это не помогло, как слои, так или иначе, не плоский, как вы можете видеть в следующей иерархии представлений:

enter image description here

Любая идея или предложение, как это сделать?

Спасибо.

ответ

7

documentation for the UIStackView class говорит, что:

Порядок массива подпанелей определяет Z-порядок подвидов. Если взгляды перекрываются, subviews с более низким индексом появляются за subviews с более высоким индексом.

который является именно тем, что я испытал в вопросе. Для более чем прийти мой конкретный случай я сделал трюк изменения семантики представления, чтобы быть RTL, как можно пчела увидеть здесь:

enter image description here

Это не перекрыт ли общий случай, так как устройство может быть установлено язык RTL в своих глобальных настройках. Для общего случая я предполагаю, что мне нужно будет проверить семантический интерфейс и заставить противоположное направление к моему представлению стека.

P.S. Это своего рода взломать, поэтому любые идеи о том, как изменить порядок Z-порядка в подзаголовках по-другому, будут наиболее желанными!

1

Другая идея может быть, чтобы установить цвет фона подвидов (7 ячеек) по умолчанию (полностью прозрачный). И установите только фон в стеке, на белом фоне.

У меня есть аналогичная проблема, но там, где у каждого подзаголовка должен быть определенный фон. И в моем случае ваш взлом может помочь ... Спасибо за это!

2

Начиная с iOS 9.0, можно независимо установить z-порядок и расположение представлений представления стека. Используйте новое свойство arrangedSubviews, чтобы указать расположение подпроектов вдоль оси представления стека. И используйте свойство subviews, чтобы указать subviews z-order на основе их индекса в массиве.

Вид стека гарантирует, что его свойство arrangedSubviews всегда является подмножеством его свойства subviews.

Documentation for arrangedSubviews

1

Ниже простое расширение на UIStackView чтобы изменить Z-индекс подпредставлений UIStackView «ы и, возможно, потребуется макет:

extension UIStackView { 

    func reverseSubviewsZIndex(setNeedsLayout: Bool = true) { 
    let stackedViews = self.arrangedSubviews 

    stackedViews.forEach { 
     self.removeArrangedSubview($0) 
     $0.removeFromSuperview() 
    } 

    stackedViews.reversed().forEach(addSubview(_:)) 
    stackedViews.forEach(addArrangedSubview(_:)) 

    if setNeedsLayout { 
     stackedViews.forEach { $0.setNeedsLayout() } 
    } 
    } 

} 
4

Это Свифт решение переворачивает стеку вид подвида порядок с использованием метода UIView sendSubview(toBack:) (docs here):

@IBOutlet weak var stackView: UIStackView! 

for view in stackView.arrangedSubviews { 
    stackView.sendSubview(toBack: view) 
} 

Когда мы продвигаемся по горизонтальным представлениям вида стека (снизу вверх), более поздняя (т. более высокие) взгляды нажимаются на дно, тем самым изменяя порядок :-)

Смежные вопросы