ViewModifier — je protokol ve SwiftUI, který umožňuje vytvářet znovupoužitelné modifikátory pro změnu vzhledu a chování View. Podle Apple Developer Documentation, 2024, ViewModifier vyžaduje implementaci metody body(content:), která přijímá původní View a vrací upravené View, přičemž zapouzdřuje libovolnou kombinaci vestavěných modifikátorů do jediného typu. Bez tohoto protokolu by vývojáři museli opakovat stejné řetězce modifikátorů na každém místě použití.
Hlavní body
ViewModifier — je SwiftUI protokol definující smlouvu pro vytváření modifikátorů, které lze aplikovat na libovolný typ View. Je deklarován jako protocol ViewModifier { associatedtype Body: View; func body(content: Content) -> Body }, kde Content je typu původního View předaného modifikátoru.
Protokol ViewModifier se objevil v iOS 13 spolu s první verzí SwiftUI a zůstává stabilní až do iOS 18+ včetně. Hlavním cílem je poskytnout vývojářům mechanismus pro zapouzdření opakujících se řetězců modifikátorů do jediného znovupoužitelného typu. Bez ViewModifier by pokaždé, když je třeba aplikovat stejnou sadu stylů, musely být všechny modifikátory ručně opakovány.
Podle Swift by Sundell (2023) je ViewModifier preferovaným způsobem organizace stylů v projektech SwiftUI, když se stejná sada modifikátorů používá na třech nebo více místech. Pro jednorázové kombinace stačí řetězec vestavěných modifikátorů přímo na View.
Protokol ViewModifier vyžaduje implementaci jedné metody body(content:) a volitelně může poskytovat vlastnosti pro konfiguraci chování prostřednictvím parametrů inicializátoru vlastního modifikátoru.
Protokol ViewModifier definuje metodu body(content:), která přijímá původní View (typ Content) a vrací upravené View (typ Body). SwiftUI aplikuje modifikátor na View, předá jej do content a použije výsledek pro zobrazení.
struct CardStyle: ViewModifier {
func body(content: Content) -> some View {
content
.padding(16)
.background(Color.white)
.cornerRadius(12)
.shadow(radius: 4, x: 0, y: 2)
}
}
// Použití:
Text("Ahoj, SwiftUI!")
.modifier(CardStyle())
Když zavoláte .modifier(CardStyle()), SwiftUI vytvoří instanci ModifiedContent<Text, CardStyle>, která ukládá původní View a modifikátor. Při vykreslování SwiftUI zavolá CardStyle.body(content: text) a získá upravené View s padding, background, cornerRadius a shadow.
Důležitý rozdíl: ViewModifier.body se volá při každé aktualizaci View, takže uvnitř body by neměly být žádné těžké výpočty nebo vedlejší účinky. Pokud modifikátor závisí na externích datech (stav, prostředí), předejte je prostřednictvím parametrů inicializátoru.
Vestavěné modifikátory SwiftUI (font, foregroundColor, frame, padding) — jsou rozšiřující metody protokolu View, které vracejí typ ModifiedContent. Neimplementují přímo ViewModifier — SwiftUI používá interní optimalizované implementace pro každý vestavěný modifikátor.
| Charakteristika | Vestavěné modifikátory | Vlastní ViewModifier |
|---|---|---|
| Implementace | Rozšiřující metody View | Protokol ViewModifier |
| Znovupoužití | Jednorázový řetězec | Vícenásobné použití |
| Parametry | Pevné (barva, velikost) | Cokoliv přes inicializátor |
| Výkon | Maximální (interní optimalizace) | O něco vyšší režie |
| Typ návratu | ModifiedContent | ModifiedContent |
Vlastní ViewModifier jsou oprávněné, když se stejná kombinace modifikátorů používá na dvou nebo více místech. Pro jednorázové použití je preferován přímý řetězec modifikátorů — kód zůstává čitelný a kompilátor lépe optimalizuje.
Podle WWDC 2023 Apple doporučuje vytvářet vlastní ViewModifier pro styly související s designovým systémem aplikace: karty, tlačítka, vstupní pole. To zajišťuje konzistenci a zjednodušuje údržbu při změně designu.
Vzor 1: zapouzdření designového systému. Nejčastější scénář použití ViewModifier — vytvoření jediného zdroje pravdy pro vizuální styly v aplikaci. Každý prvek designového systému (karta, tlačítko, nadpis) dostává svůj vlastní modifikátor.
struct PrimaryButton: ViewModifier {
var isEnabled: Bool
func body(content: Content) -> some View {
content
.font(.headline.weight(.semibold))
.foregroundColor(.white)
.padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))
.background(isEnabled ? Color.blue : Color.gray)
.cornerRadius(8)
.opacity(isEnabled ? 1.0 : 0.6)
}
}
Vzor 2: podmíněná aplikace modifikátoru. Někdy je třeba aplikovat modifikátor pouze za určitých podmínek. ViewModifier s boolovským parametrem umožňuje zapouzdřit tuto logiku uvnitř body.
Vzor 3: kompozice modifikátorů. ViewModifier může aplikovat jiné ViewModifikátory uvnitř svého body. To umožňuje vybudovat hierarchii modifikátorů, kde každý odpovídá za svůj aspekt vizuální prezentace. Například CardStyle může interně aplikovat ShadowStyle a BorderStyle.
Podle Point-Free (2024) je kompozice modifikátorů prostřednictvím ViewModifier výhodnější než dědičnost: každý modifikátor odpovídá za jeden úkol a lze je kombinovat nezávisle. To je v souladu s principem jediné odpovědnosti ve SwiftUI.
Výkon ViewModifier závisí na počtu obalů ModifiedContent vytvořených při každé aplikaci. SwiftUI optimalizuje řetězce modifikátorů pomocí diffingu ve fázi vykreslování, ale nadměrný počet modifikátorů může zpomalit aktualizaci.
| Počet modifikátorů | Dopad na výkon | Doporučení |
|---|---|---|
| 1–5 | Minimální | Normální pro jakékoli View |
| 5–10 | Mírný | Seskupit do ViewModifier |
| 10–20 | Znatelný | Spojit do jednoho vlastního modifikátoru |
| 20+ | Kritický | Přehodnotit architekturu View |
Optimalizace: slučte několik po sobě jdoucích modifikátorů stejného typu (např. několik padding) do jednoho. Používejte PreferenceKey pouze tehdy, když je to skutečně nutné — modifikátory čtoucí preference způsobují další průchod vykreslování.
Praktické pravidlo: pokud má View více než 10 modifikátorů — přesuňte část z nich do vlastního ViewModifier. To zlepší čitelnost a umožní SwiftUI optimalizovat aktualizace. Podle SwiftUI Lab (2024) snižuje seskupování modifikátorů do ViewModifier dobu vykreslování o 15–30% pro složitá View.
Často kladené otázky
ViewModifier — je protokol pro vytváření znovupoužitelných modifikátorů, které mění vzhled nebo chování View. Vyžaduje implementaci metody body(content:), která přijímá původní View a vrací upravené View.
Vestavěné modifikátory (font, padding) jsou rozšiřující metody protokolu View využívající interní optimalizované implementace. ViewModifier je protokol pro vlastní modifikátory, které zapouzdřují kombinaci vestavěných modifikátorů a mohou mít parametry inicializátoru.
Vytvořte vlastní ViewModifier, když se stejná kombinace modifikátorů používá ve třech nebo více místech. Pro jednorázové řetězce použijte přímé modifikátory na View — je to jednodušší a efektivnější.
Ano, ViewModifier může obsahovat vlastnosti @State nebo @Environment. SwiftUI spravuje jejich životní cyklus stejně jako u View. Pamatujte však, že body se volá při každé aktualizaci, proto se vyhýbejte těžkým operacím v těle modifikátoru.
Použijte if/else uvnitř @ViewBuilder nebo vytvořte modifikátor s boolovským parametrem, který uvnitř body aplikuje nebo přeskočí změny. Například PrimaryButton výše používá isEnabled pro podmíněnou aplikaci stylu.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také