Как сделать так, чтобы верхняя часть фона списка оставалась фиксированной?

Как сделать так, чтобы верхняя часть фона списка оставалась фиксированной?

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

import SwiftUI
import Foundation

struct Attendance: Identifiable {
    let id = UUID()
    let name: String
}

struct AttendanceRow: View {
    var attendance: Attendance
    
    var body: some View {
        HStack {
            Text(attendance.name)
        }
        .padding(.vertical, 20)
    }
}

struct ContentView: View {
    let attendances = [
        Attendance(name: "John"),
        Attendance(name: "Michael"),
        Attendance(name: "Steve"),
        Attendance(name: "Donald"),
        Attendance(name: "Johathan"),
        Attendance(name: "William"),
        Attendance(name: "Dave"),
        Attendance(name: "Richard"),
        Attendance(name: "Boris"),
        Attendance(name: "Catherine"),
        Attendance(name: "Susan")
    ]
    
    var body: some View {
        NavigationView {
            VStack {
                List {
                    ForEach(attendances) { attendance in
                        AttendanceRow(attendance: attendance)
                    }
                }
            }
        }
    }
}

Итак, вы хотите перемещать только содержимое внутри него? Я правильно понял?

Radioactive 30.06.2024 23:01

Да, я не хочу, чтобы светло-серый цвет выходил за пределы верхней части экрана.

Adventure 30.06.2024 23:04

Избавьтесь от списка и добавьте фон в стек.

lorem ipsum 01.07.2024 01:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы просто пытаетесь удалить пространство над списком, то этот ответ на вопрос Удалить верхнее отступы из списка может помочь. Затем:

  • Чтобы предотвратить прокрутку списка через безопасную область в верхней части экрана, добавьте номинальное верхнее дополнение, равное 1. Это нарушит контакт с краем безопасной области.
  • Чтобы заполнить остальную часть экрана тем же фоном, что и окружающий список, примените UIColor.systemGroupedBackground в качестве фона к VStack.
NavigationView {
    VStack {
        List {
            Section {
                ForEach(attendances) { attendance in
                    AttendanceRow(attendance: attendance)
                }
            } header: {
                Spacer(minLength: 0)
                    .listRowInsets(EdgeInsets())
            }
        }
        .environment(\.defaultMinListHeaderHeight, 0)
        .padding(.top, 1)
    }
    .background(Color(.systemGroupedBackground))
}

Animation


EDIT2. Судя по вашим комментариям, один из способов сохранить углы фиксированными и круглыми - это «приклеить» закругленные углы в качестве наложения. Если цвет соответствует цвету фона, то они видны только при прокрутке списка вверх, в остальное время они просто сливаются с фоном.

NavigationView {
    VStack {
        List {
            Section {
                ForEach(attendances) { attendance in
                    AttendanceRow(attendance: attendance)
                }
            } header: {
                Spacer(minLength: 0)
                    .listRowInsets(EdgeInsets())
            }
        }
        .environment(\.defaultMinListHeaderHeight, 0)
        .overlay {
            RoundedRectangle(cornerRadius: 10)
                .fill()
                .blendMode(.destinationOut)
                .padding(.horizontal, 20)
                .background(Color(.systemGroupedBackground))
                .compositingGroup()
                .ignoresSafeArea(edges: .bottom)
                .allowsHitTesting(false)
        }
        .padding(.top, 1)
    }
    .background(Color(.systemGroupedBackground))
}

[Animation

Отлично, это дает желаемый эффект. Не хватает только одного: углы списка всегда должны быть закруглены.

Adventure 01.07.2024 11:09

(Углы должны оставаться закругленными)

Adventure 01.07.2024 11:52

Спасибо, что уделили время, но я хочу, чтобы список вел себя как раньше, но с закругленными углами. Текущее поведение: s4.ezgif.com/tmp/ezgif-4-2dab8301b7.gif Запрошенное поведение (но со скругленными углами): s3.ezgif.com/tmp/ezgif-3-bb05a0fbac.gif

Adventure 01.07.2024 12:41

Срок действия ваших ссылок на изображения истек @Adventure

Radioactive 01.07.2024 14:09

@Radioactive Вот рабочие ссылки. Текущее поведение: imgur.com/dckAPKT Запрошенное поведение (но всегда со скругленными углами): imgur.com/TE4AwWj

Adventure 01.07.2024 14:39

@Adventure Итак, если я правильно понимаю: когда вы тянете список вниз сверху, фон (с закругленными углами) должен казаться прикрепленным к строкам и перемещаться вниз вместе со строками. Но когда вы прокручиваете вверх, фон должен казаться отделенным от строк и оставаться на месте. То же самое касается нижнего края (в обратном порядке). Правильный?

Benzy Neez 01.07.2024 15:36

Вот отредактированный GIF, который показывает именно то, что мне нужно, я изо всех сил старался прояснить это: i.imgur.com/lZVPin2.gif

Adventure 01.07.2024 17:09

«Когда вы тянете список вниз сверху, фон (с закругленными углами) должен казаться прикрепленным к строкам и перемещаться вниз вместе со строками. Но когда вы прокручиваете вверх, фон должен казаться отделенным от строк. и должен оставаться на месте». Да, для верхнего края. Поведение нижнего края по умолчанию в порядке, как в отредактированном GIF.

Adventure 01.07.2024 17:43

@Adventure ОК, ответ снова обновлен. Измените цвет фона (в наложении) на что-то вроде Color.orange, чтобы увидеть, что происходит.

Benzy Neez 01.07.2024 17:51

Другие вопросы по теме

Похожие вопросы

Как создать VStack, содержащий коллекцию текстовых полей при нажатии кнопки в Swift iOS?
Вызов асинхронной функции в .sheet или .fullScreenCover SwiftUI
Ограниченный доступ к фотографиям, дающий полный доступ на iOS при использовании image_picker на Flutter
Как отключить изменение цвета заголовка, когда выделенное состояние для UIButton с помощью UIButtonConfiguration активно?
Шифрование AES/GCM/NoPadding в Swift iOS (минимальное развертывание 12.1) не дает ожидаемой длины зашифрованного текста
Каков результат #if MACRO и MACRO определен без значения?
Приложение React-Native iOS аварийно завершает работу сразу после запуска при создании сборки для разработки
Как заставить Spring Animations с ограничениями вести себя правильно?
Пытаюсь реализовать полосу во Flutter/iOS, и я получаю ошибки во всех сгенерированных файлах в Pod, поэтому я даже не могу запустить приложение
VisionOS: сократить время сборки пакета rkassets