SwiftUI Liquid Glass: Teljes útmutató az iOS 26 designnyelvhez 2026-ban

Ismerd meg az iOS 26 új Liquid Glass designnyelvét: a glassEffect API, a GlassEffectContainer, morfológiai animációk és bevált gyakorlatok komplett kódpéldákkal.

Liquid Glass iOS 26: SwiftUI Guide 2026

Bevallom, az Apple WWDC keynote-okat ritkán nézem élőben — de a 2025-ös eseményt nem hagyhattam ki. Nem véletlenül: az iOS 7 óta nem volt akkora vizuális megrázkódtatás, mint amit a Liquid Glass designnyelv hozott. 2026-ban, az iOS 26 elterjedésével pedig a SwiftUI-fejlesztők számára egyszerűen megkerülhetetlenné vált a .glassEffect() modifier ismerete.

Ez az útmutató lépésről lépésre végigvezet a Liquid Glass implementálásán: az alap API-tól a morfológiai animációkon át egészen az Apple hivatalos best practice-eiig. Konkrét kódpéldákkal, és néhány buktatóval, amibe magam is belefutottam.

Mi az a Liquid Glass, és miért most kell foglalkozni vele?

Először tisztázzunk valamit: a Liquid Glass nem egy újabb átlátszó háttéreffekt. Sokan ezt hiszik elsőre (én is, őszintén), pedig sokkal több annál. Egy dinamikus anyagrendszerről van szó, amely a valódi üveg optikai tulajdonságait szimulálja — fénytörést, tükröződést, mélységet és mozgásra való reakciót.

A hagyományos blur szétszórja a fényt. A Liquid Glass viszont valós időben hajlítja és fókuszálja a beérkező fényt — ezt nevezi az Apple lensing-nek. Apróságnak tűnhet, de nézz meg egy iOS 26-os toolbar-t pörgetés közben: az élek mentén tényleg úgy viselkedik, mintha üveg lenne.

Az iOS 26, iPadOS 26, macOS Tahoe 26, watchOS 26, tvOS 26 és visionOS 4 mind ezt a designnyelvet használja. Ha az appod natív SwiftUI vezérlőket használ, és az iOS 26 SDK-val fordítod újra, a toolbar és a tab bar elemei automatikusan átveszik az új megjelenést. A custom view-knál viszont — és itt kezdődik a munka — explicit módon kell alkalmaznod a glass effektet.

Mikor érdemes használni?

  • Igen: navigációs sávok, toolbar-ok, tab bar, lebegő akciógombok (FAB), sheetek, popoverek, menük, rendszerszintű alertek.
  • Nem: tartalmi rétegek (List, Table, média), teljes képernyős hátterek, görgethető tartalom, egymásra rétegzett glass felületek — és tényleg ne mindenre, még ha csábító is.

A glassEffect modifier alapjai

Kezdjük az elejéről. A legegyszerűbb használat egyetlen modifier hozzáadásával jár — ennél nehezebb dolgod nincs. Vegyünk egy lebegő gombot, ami Liquid Glass effektet kap:

import SwiftUI

struct FloatingActionButton: View {
    var body: some View {
        Button(action: { print("Tapped") }) {
            Image(systemName: "plus")
                .font(.title2)
                .foregroundStyle(.primary)
                .padding(20)
        }
        .glassEffect()
    }
}

Ennyi. A teljes szignatúra pedig így néz ki:

func glassEffect<S: Shape>(
    _ glass: Glass = .regular,
    in shape: S = DefaultGlassEffectShape,
    isEnabled: Bool = true
) -> some View

A Glass struct változatai

A Glass struct három statikus variánst kínál, és ezek határozzák meg a vizuális karaktert:

  • .regular — alapértelmezett, kiegyensúlyozott áttetszőség. A legtöbb esetben ez kell.
  • .clear — minimálisan átlátszó, élénkebb háttértartalom mellett működik jól.
  • .identity — kikapcsolt effekt. Hangzik furán, de animációs átmeneteknél nagyon hasznos.

Ezekhez két fontos modifier kapcsolódik:

  • .tint(_:) — szemantikus színezés (pl. primary action, hibajelzés).
  • .interactive(_:) — érintésre reagáló viselkedést kapcsol be (megnyomásnál enyhén deformálódik, ami imádnivaló).
Button("Mentés") { save() }
    .padding(.horizontal, 24)
    .padding(.vertical, 12)
    .glassEffect(.regular.tint(.blue).interactive(), in: .capsule)

Támogatott alakzatok

A shape paraméter bármely Shape protokollnak megfelelő típust elfogad. A leggyakoribbak:

  • .capsule — alapértelmezett, gombokhoz ideális.
  • .circle — kör alakú akciógombokhoz.
  • .rect(cornerRadius:) — kerekített téglalap kártyákhoz.
  • .containerConcentric — a szülő konténer sarkaival koncentrikusan illeszkedő alakzat (új iOS 26-ban, és tényleg jól működik).

GlassEffectContainer: a kompozíció kulcsa

Itt jön a rész, amit a dokumentáció elsőre könnyen átsiklik: az üveg nem tud másik üveget mintavételezni. Ha két .glassEffect() view-t egyszerűen egymásra raksz, a vizuális minőség és a teljesítmény is szenved.

Erre szolgál a GlassEffectContainer — közös mintavételi régiót biztosít, és lehetővé teszi az elemek vizuális egyesülését, ha közel kerülnek egymáshoz. Ez az a "folyékony" érzés, amit a marketinganyagokban is mutogatnak.

struct ToolbarExample: View {
    var body: some View {
        GlassEffectContainer(spacing: 16) {
            HStack(spacing: 12) {
                Button(action: {}) {
                    Image(systemName: "heart")
                        .padding(12)
                }
                .glassEffect(in: .circle)

                Button(action: {}) {
                    Image(systemName: "bookmark")
                        .padding(12)
                }
                .glassEffect(in: .circle)

                Button(action: {}) {
                    Image(systemName: "square.and.arrow.up")
                        .padding(12)
                }
                .glassEffect(in: .circle)
            }
        }
    }
}

A spacing paraméter határozza meg azt a küszöböt, amin belül az elemek vizuálisan összeolvadnak — pontosan úgy, mint a vízcseppek. Ezzel játszani kell egy kicsit, de ha eltalálod, nagyon jó eredményt ad.

Morfológiai animációk: glassEffectID

Na, ez talán a kedvenc részem. A Liquid Glass leglátványosabb képessége a morphing: az üveg alakzatok folyamatos átalakulása egyik formából a másikba. A trükk a .glassEffectID() modifier, ami összekapcsolja az elemeket — így a SwiftUI tudja animálni közöttük az átmenetet.

struct MorphingExample: View {
    @Namespace private var glassNamespace
    @State private var isExpanded = false

    var body: some View {
        GlassEffectContainer(spacing: 24) {
            if isExpanded {
                VStack(spacing: 16) {
                    Text("Részletes nézet")
                        .font(.headline)
                    Button("Bezárás") {
                        withAnimation(.spring) { isExpanded = false }
                    }
                }
                .padding(32)
                .glassEffect(in: .rect(cornerRadius: 24))
                .glassEffectID("panel", in: glassNamespace)
            } else {
                Button(action: {
                    withAnimation(.spring) { isExpanded = true }
                }) {
                    Image(systemName: "info.circle")
                        .font(.title)
                        .padding(16)
                }
                .glassEffect(in: .circle)
                .glassEffectID("panel", in: glassNamespace)
            }
        }
    }
}

A két állapot ugyanazt a glassEffectID-t és Namespace-t használja, ezért a SwiftUI nem keresztúsztatást, hanem fizikai morphingot animál: az üveg fenntartja a transzparens anyagát az átalakulás teljes ideje alatt. Az első alkalommal, mikor élesben láttam, nem akartam elhinni, hogy ennyivel megoldható.

Bevált gyakorlatok az Apple szerint

1. Glass csak a navigációs rétegen

Az Apple iránymutatása itt nem hagy mozgásteret: "a Liquid Glass arra a navigációs rétegre van fenntartva, amely az appod tartalma felett lebeg." A tartalom alapszinten marad, a glass vezérlők lebegnek felette — ez a szétválasztás hozza létre a mélységérzetet.

2. Soha ne tegyél üveget üvegre

Ne rétegezz egymásra glass elemeket. Ha közel vannak egymáshoz, csoportosítsd őket egy GlassEffectContainer-ben. Komolyan, ezt a hibát az első napokban én is elkövettem.

3. List soraira ne kerüljön glassEffect

Hibás minta:

// ❌ Helytelen
List(items) { item in
    HStack { Text(item.name) }
        .glassEffect()
}

Helyes minta — lebegő FAB egy ZStack-ben a lista felett:

// ✅ Helyes
ZStack(alignment: .bottomTrailing) {
    List(items) { item in
        Text(item.name)
    }
    Button(action: addItem) {
        Image(systemName: "plus")
            .padding(20)
    }
    .glassEffect(.regular.tint(.accentColor).interactive(), in: .circle)
    .padding(24)
}

4. A tint legyen szemantikus, ne dekoratív

A tint jelentést hordozzon: elsődleges akció, állapot, figyelmeztetés. Ne csak színesítésre használd — látvány szempontjából egyébként is sokkal letisztultabb így.

5. Bízz rá az akadálymentesítést a rendszerre

A SwiftUI automatikusan kezeli a Reduce Transparency, Increase Contrast és Reduce Motion beállításokat. Csak akkor írd felül, ha tényleg muszáj.

Visszafelé kompatibilitás iOS 25-tel és korábbi rendszerekkel

Mivel a .glassEffect() csak iOS 26-tól érhető el, korábbi rendszereken fallback szükséges. A legtisztább megoldás egy ViewModifier protokoll-konform típus, ami @available-lel ellenőrzi a verziót:

extension View {
    @ViewBuilder
    func adaptiveGlass<S: Shape>(in shape: S = .capsule) -> some View {
        if #available(iOS 26.0, *) {
            self.glassEffect(in: shape)
        } else {
            self
                .background(.ultraThinMaterial, in: shape)
                .overlay(
                    shape.stroke(.white.opacity(0.2), lineWidth: 1)
                )
        }
    }
}

Az iOS 25 és korábbi verziókon a .ultraThinMaterial hasonló — bár jóval egyszerűbb — vizuális élményt nyújt, és fenntartja az app működőképességét. Nem azonos, de rendben elfogadható kompromisszum.

Ismert hibák és megkerülő megoldások

  • iOS 26.1: ha egy Menu-t GlassEffectContainer-be teszel, a morphing animáció megszakad. Megoldás: használd a .glassEffect(.regular.interactive())-t közvetlenül a Menu-n.
  • Shape inkonzisztencia: a .glassEffect(.regular.interactive(), in: RoundedRectangle()) néha kapszula alakkal renderelődik. Workaround: gomboknál használd a .buttonStyle(.glass)-t.
  • Renderelési artifaktok: a .glassProminent és .circle kombinációja időnként vizuális hibát produkál — kerüld a kombinációt, vagy használj .capsule-t.

Teljesítmény az új designnyelvvel

A glass effektek valós idejű kompozitálást, blurt és fénytörést igényelnek. Ez papíron drágán hangzik. A gyakorlatban viszont a modern Apple hardvereken (A15 vagy újabb, M1 vagy újabb) a teljesítményhatás elhanyagolható, mivel az iOS 26 grafikus pipeline-ját kifejezetten erre optimalizálták.

Régebbi eszközökön (pl. iPhone XR, iPhone 11 mini) viszont érdemes Instruments segítségével profilozni a kritikus képernyőket. Egy XR-en simán megduplázódhat a frame idő, ha túltolod.

Gyakorlati példa: lebegő tab bar Liquid Glass effekttel

Lássunk egy összetettebb, valós példát: egy egyéni lebegő tab bar, ami az iOS 26 designjához igazodik.

struct FloatingTabBar: View {
    @Binding var selection: Tab

    var body: some View {
        GlassEffectContainer(spacing: 8) {
            HStack(spacing: 4) {
                ForEach(Tab.allCases) { tab in
                    Button(action: { selection = tab }) {
                        VStack(spacing: 4) {
                            Image(systemName: tab.icon)
                                .font(.title3)
                            Text(tab.title)
                                .font(.caption2)
                        }
                        .padding(.horizontal, 16)
                        .padding(.vertical, 8)
                        .foregroundStyle(selection == tab ? .primary : .secondary)
                    }
                    .glassEffect(
                        selection == tab
                            ? .regular.tint(.accentColor).interactive()
                            : .regular.interactive(),
                        in: .capsule
                    )
                }
            }
            .padding(6)
        }
        .padding(.horizontal, 16)
    }
}

enum Tab: String, CaseIterable, Identifiable {
    case home, search, profile
    var id: String { rawValue }
    var icon: String {
        switch self {
        case .home: "house"
        case .search: "magnifyingglass"
        case .profile: "person"
        }
    }
    var title: String {
        switch self {
        case .home: "Kezdőlap"
        case .search: "Keresés"
        case .profile: "Profil"
        }
    }
}

Ez a komponens egyetlen GlassEffectContainer-en belül egyesíti a tab elemeket, így vizuálisan összeolvadnak — és közben a kiválasztott tab a tint révén kiemelkedik. Pofonegyszerű, mégis nagyon jól mutat.

Gyakran feltett kérdések (FAQ)

Mi a különbség a .ultraThinMaterial és a .glassEffect között?

A .ultraThinMaterial egy egyszerű blur háttér, ami az iOS 15 óta elérhető. A .glassEffect() ezzel szemben fénytörést, lensing-et, dinamikus tükröződést és morfológiai animációkat is támogat — ez egy teljes anyagrendszer, nem csak háttéreffekt. iOS 25 vagy korábbi rendszereken visszaesésként érdemes .ultraThinMaterial-t használni.

Át kell írnom a meglévő appomat Liquid Glass-ra?

Nem azonnal. Ha natív SwiftUI vezérlőket használsz, az iOS 26 SDK-val való újrafordítás automatikusan átveszi az új megjelenést a toolbar és tab bar elemeknél. A custom UI-d viszont csak akkor kap glass effektet, ha explicit alkalmazod. Az Apple a fokozatos átállást javasolja: új komponenseket már Liquid Glass-szal építs, a meglévőket pedig prioritás szerint frissítsd.

Milyen iOS 26-kompatibilis eszközök támogatják a Liquid Glass-t?

Az iOS 26 az iPhone 11-től támogatja a Liquid Glass-t, az iPadOS 26 pedig az M1 vagy újabb chipes iPadeket. Az effekt minden támogatott eszközön elérhető, de a legjobb teljesítményt A15 Bionic vagy újabb chipeken éri el. Régebbi eszközökön a rendszer automatikusan egyszerűsítheti a renderelést.

Hogyan teszteljem a Liquid Glass UI-t Reduce Transparency aktív állapotban?

Az Xcode 26 Simulatorban válaszd a Features → Toggle Reduce Transparency menüpontot, vagy valós eszközön a Settings → Accessibility → Display & Text Size → Reduce Transparency menüben kapcsold be. A SwiftUI automatikusan opacitást ad a glass elemeknek ebben a módban, így nem kell saját logikát írnod — de érdemes ellenőrizni a kontrasztot és olvashatóságot.

Használhatom a glassEffect-et List soraira?

Nem, az Apple kifejezetten kerülendőnek tartja. A glass effekt a navigációs réteghez tartozik, nem a tartalomhoz. List sorokon a transzparencia rontja az olvashatóságot, és felesleges teljesítményköltséget okoz. Helyette használj lebegő akciógombokat (FAB) egy ZStack-ben a lista felett, vagy testreszabott swipe akciókat hagyományos színekkel.

Összegzés

A Liquid Glass nem csupán egy újabb designtrend — őszintén, az Apple platformokon a UI-fejlesztés új alapját jelenti 2026-ban és azután. A .glassEffect(), GlassEffectContainer és .glassEffectID() hármasa együtt egy expresszív, deklaratív API-t alkot, amivel mély, dinamikus felületeket építhetsz minimális kóddal.

A kulcs viszont a fegyelmezett alkalmazás: csak a navigációs rétegen, soha üveget üvegre, és mindig szemantikus tinttel. Ha ezeket az alapelveket követed, az appod nemcsak modernül fog kinézni, hanem a rendszerrel harmonizálva fog viselkedni az összes Apple platformon. És higgyétek el — a felhasználók ezt megérzik, akkor is, ha nem tudják megnevezni, mi az, ami tetszik nekik.

A Szerzőről Tomasz Wojcik

Tomasz is a Krakow-based iOS engineer with 11 years of Swift experience. He spent four years at Revolut on the Wealth team, where he rewrote the trading charts in SwiftUI and shaved 40% off cold-start time by lazy-loading the analytics SDK. Before Revolut he was at Allegro, Poland's largest e-commerce platform, on the Seller Center iOS team. His specialty is iOS performance work: Instruments deep-dives, memory-graph debugging, and figuring out why your scroll view drops frames only on iPhone SE 2nd-gen. He has contributed patches to swift-syntax and writes a quarterly newsletter for iOS engineers that covers under-discussed APIs like BackgroundTasks and NSFileCoordinator. Tomasz holds the iOS App Development with Swift certification from Apple and occasionally runs paid workshops on Swift concurrency for in-house engineering teams in Europe.