Элемент, который всегда отрисован на экране

Как отображать элемент вверху экрана, при скроле вниз элемент скрывать, как только начинается скрол вверх отображать? Toolbar элемента NavigationView не подходит, так как title не скрыть, не затронув все элементы тулбара


Ответы (1 шт):

Автор решения: Владимир Муравьев

Например, можно использовать Geometry Reader чтобы отслеживать координату на предмет изменения направления:

struct ContentView: View {

@State var array: [Int] = (0...100).map({$0})
@State var coordinate: CGFloat?
@State var isShowMessage: Bool = true

var body: some View {
    ZStack(alignment: .top) {
        
        ScrollView {
            
            GeometryReader { geo in
                Rectangle()
                    .frame(width: 1, height: 1)
                    .background(Color.clear)
                    .onChange(of: geo.frame(in: .global).midY) { newValue in
                        updateScrollDirection(by: newValue)
                    }
            }
            
            ForEach(array, id: \.self) { num in
                Text("Item \(num)")
                    .frame(maxWidth: .infinity)
                    .padding(16)
                    .background(Color.yellow)
                
            }
        }
        .padding()
        
        if isShowMessage {
            Text("Some message here")
                .frame(maxWidth: .infinity)
                .padding(.horizontal, 16)
                .padding(.vertical, 30)
                .background(Color.blue)
        }
    }
}

func updateScrollDirection(by currentValue: CGFloat) {
    
    guard let coordinate = coordinate else {
        coordinate = currentValue
        return
    }
    
    let delta = currentValue - coordinate
    if delta <= 0 {
        isShowMessage = false
    } else {
        isShowMessage = true
    }
    
    self.coordinate = currentValue
}

}

→ Ссылка