0Pricing
Swift Academy · Lekcja

Mierzenie podwidoków

Sprawdzanie rozmiarów podwidoków podczas układania.

Mierzenie podwidoków to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Pomiar wyznacza układ

Zanim będzie można rozmieścić elementy potomne, trzeba je zmierzyć. Układ SwiftUI jest negocjacją: rodzic proponuje rozmiary, elementy potomne odpowiadają, a następnie należy uzgodnić te odpowiedzi.

Pytanie podwidoku o jego rozmiar

Każde proxy w kolekcji Subviews odpowiada na sizeThatFits(_:) dla danej propozycji ProposedViewSize. Proxy zwraca rozmiar, jaki element potomny przyjąłby dla tej propozycji.

let size = subview.sizeThatFits(.unspecified)

Trzy propozycje testowe

Aby poznać elastyczność elementu potomnego, sprawdź go na trzy sposoby: .zero ujawnia jego rozmiar minimalny, .infinity — maksymalny, a .unspecified — idealny.

let minSize = subview.sizeThatFits(.zero)
let maxSize = subview.sizeThatFits(.infinity)
let ideal = subview.sizeThatFits(.unspecified)

Proponowanie konkretnej szerokości

W przypadku tekstu z zawijaniem zaproponuj konkretną szerokość, a wysokość pozostaw jako nil. Element potomny zgłosi wysokość potrzebną przy tej szerokości.

let proposal = ProposedViewSize(width: 200, height: nil)
let fit = subview.sizeThatFits(proposal)

Priorytet układu

Każdy podwidok udostępnia wartość priority (ustawianą za pomocą .layoutPriority). Gdy brakuje miejsca, należy najpierw przydzielić dzieciom o wyższym priorytecie ich idealny rozmiar.

for subview in subviews {
    let p = subview.priority
    // distribute space to higher priority first
}

Odczytywanie wartości niestandardowych

Podwidoki mogą przechowywać dane określonego typu za pomocą LayoutValueKey. Układ odczytuje subview[MyKey.self], aby uwzględnić tę wartość przy rozmieszczaniu — na przykład odstęp dla konkretnego elementu.

private struct RankKey: LayoutValueKey {
    static let defaultValue: Int = 0
}
let rank = subviews[0][RankKey.self]

Ustawianie wartości układu

Widok ustawia swoją wartość układu za pomocą modyfikatora layoutValue(key:value:), dzięki czemu dzieci mogą przekazywać wskazówki do układu.

Text("Featured").layoutValue(key: RankKey.self, value: 10)

Odstępy między podwidokami

Podwidoki udostępniają preferencje dotyczące spacing. Użyj subview.spacing.distance(to:along:), aby uzyskać zalecaną przerwę między dwoma sąsiednimi dziećmi wzdłuż osi.

let gap = subviews[0].spacing.distance(
    to: subviews[1].spacing, along: .horizontal)

Sumowanie rozmiarów

Układ poziomy sumuje szerokości dzieci i przyjmuje wysokość najwyższego z nich. Zmierzenie wszystkich dzieci przed ich rozmieszczeniem pozwala obliczyć rozmiar kontenera, zanim cokolwiek zostanie umieszczone.

let sizes = subviews.map { $0.sizeThatFits(.unspecified) }
let totalWidth = sizes.reduce(0) { $0 + $1.width }
let maxHeight = sizes.map(\.height).max() ?? 0

Ponowny pomiar podczas rozmieszczania

W placeSubviews należy ponownie wykonać pomiar (lub użyć rozmiarów z pamięci podręcznej), aby pozycje odpowiadały wcześniej zgłoszonym wartościom. Pomiary są szybkimi wywołaniami zastępczymi, a nie rzeczywistym renderowaniem.

func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) {
    for s in subviews {
        let size = s.sizeThatFits(.unspecified)
        // use size to position s
        _ = size
    }
}

Uwzględnianie propozycji rodzica

Zawsze należy respektować otrzymaną propozycję. Jeśli rodzic proponuje stałą szerokość, należy rozmieścić dzieci w jej obrębie; nie wolno po cichu wychodzić poza nią, ponieważ układ zostanie przycięty.

let containerWidth = proposal.width ?? .infinity

Szybkie sprawdzenie: pomiary

Sprawdź swoją wiedzę na temat pomiarów podwidoków.

Podsumowanie: pomiary podwidoków

Pomiar jest sercem niestandardowego układu. Sprawdzaj dzieci za pomocą .zero, .infinity i .unspecified, aby poznać ich minimalne, maksymalne i idealne rozmiary, proponuj konkretne szerokości zawartości zawijanej do wierszy oraz respektuj priorytet układu i preferencje dotyczące odstępów.

Niestandardowe wartości LayoutValueKey pozwalają dzieciom przekazywać wskazówki. W obu metodach protokołu wykonuj pomiary w spójny sposób, aby zgłaszany rozmiar i rozmieszczenie zawsze były zgodne.

Często zadawane pytania

Czy lekcja „Mierzenie podwidoków” jest bezpłatna?

Tak — pełny tekst „Mierzenie podwidoków” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Mierzenie podwidoków”?

Sprawdzanie rozmiarów podwidoków podczas układania. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Mierzenie podwidoków”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podstawy protokołu Layout
  2. Mierzenie podwidoków
  3. Budowanie układu przepływowego
  4. Pamięć podręczna układu i wydajność
← Powrót do Swift Academy