Geliştiriciler
SwiftUI Scroll Edge Effect: Soft ve Hard, iOS 27'deki Değişiklik
iPhone ve iPhone Duo'da SwiftUI scroll edge effect: .soft ve .hard farkı, iOS 27'de bar'ların neden opak göründüğü, iOS 26 geçişini geri getirme ve UIKit API'si.
AppleDuo EditörlüğüYayınlanma 6 dk okuma
Bu sayfada
- SwiftUI'da scroll edge effect nedir?
- .soft ile .hard arasındaki fark nedir?
- Scroll edge effect iOS 27'de neden farklı görünüyor?
- iOS 26'daki scroll edge geçişini iOS 27'de nasıl geri getiririm?
- Scroll edge effect tek bir kenar için nasıl ayarlanır veya gizlenir?
- UIKit'te scroll edge effect nasıl değiştirilir?
- Scroll edge effect iPhone Duo'nun dikey bar'ıyla nasıl çalışır?
- Önemli çıkarımlar
Bir uygulamayı Xcode 27 ile yeniden derlediğinizde navigation bar'ları birden farklı görünebilir. İçeriğin eskiden toolbar'ın altında yumuşakça kaybolduğu yerde artık belirgin bir çizgi ve daha opak bir şerit var. Kodunuzda hiçbir şey değişmedi. Değişen, SwiftUI'daki varsayılan scroll edge effect: iOS'un kayan içeriğin bir bar ile buluştuğu yere uyguladığı işlem.
Bu rehber scroll edge effect'in ne olduğunu, .soft ile .hard'ın nasıl farklılaştığını, iOS 26 ile iOS 27 arasında neyin değiştiğini ve SwiftUI ile UIKit'te istediğiniz görünümü nasıl seçeceğinizi anlatıyor. Apple'ın dokümantasyonuna ve WWDC25 oturumlarına, geliştirici forumlarındaki bir Apple mühendisinin yanıtına ve @sarunw dahil geliştiricilerin raporlarına dayanıyor. iOS 27'deki değişiklik Apple'ın sürüm notlarında yer almıyor; bu yüzden onu sürümler arasında değişebilecek, gözlemlenmiş bir davranış olarak ele alın.
SwiftUI'da scroll edge effect nedir?
Scroll edge effect, iOS 26'da Liquid Glass'ın bir parçası olarak geldi. Toolbar'lar artık opak bir arka planın üzerinde durmuyor; öğeleri içeriğinizin üzerinde yüzüyor. Bu öğelerin okunabilir kalması için sistem, altlarından kayan içeriğe bir işlem uyguluyor. Apple'ın WWDC25 oturumu Build a SwiftUI app with the new design bunu "sistem toolbar'larının altındaki içeriğe uygulanan ince bir bulanıklık ve solma efekti" olarak tanımlıyor.
Sistem bar'larının altında bunu otomatik olarak alırsınız. Apple, bar öğelerinin arkasına koyduğunuz ek arka planları veya karartma katmanlarını kaldırmanızı istiyor, çünkü bunlar efektle çakışıyor. Özel bar'lar da buna katılabilir: iOS 26 ile gelen SwiftUI'ın safeAreaBar(edge:alignment:spacing:content:)'ı, içeriği bir view'un yanında özel bir bar olarak gösterir ve altındaki scroll view'lar bir sistem bar'ının altındakine benzer bir kenar efekti alır.
Efekti, yine iOS 26 ile gelen scrollEdgeEffectStyle(_:for:) ile kontrol edersiniz. Değiştirdiğiniz view'un içindeki tüm scroll view'lara uygulanır; bu yüzden her scroll view'a ayrı ayrı değil, bir container'a ayarlayabilirsiniz.
.soft ile .hard arasındaki fark nedir?
ScrollEdgeEffectStyle'ın üç değeri var. Apple bunları şöyle tanımlıyor:
| Stil | Apple'ın tanımı | Tipik kullanım |
|---|---|---|
.automatic | Sabitlenmiş içerik kayan içerikle çakıştığında sistem tarafından uygulanır | Varsayılan; kararı iOS'a bırakır |
.soft | Sabitlenmiş kontroller ile kayan içerik arasında ince, bulanık bir sınır | Çoğu uygulamanın iOS 26'da üstte sahip olduğu geçiş |
.hard | Sabitlenmiş kontroller ile kayan içerik arasında doğrusal, neredeyse opak bir sınır | Çok sayıda yüzen öğe içeren yoğun arayüzler |
Apple'ın yoğun arayüz örneği Calendar uygulaması. Oturumun UIKit versiyonunda Apple, hard stilin iOS 18'deki standart bar arka planlarına benzediğini söylüyor. SwiftUI oturumundaki örnek şöyle:
ScrollView {
// içerik
}
.scrollEdgeEffectStyle(.hard, for: .top)
Scroll edge effect iOS 27'de neden farklı görünüyor?
İki şey değişti ve bunları karıştırmak kolay.
Varsayılan değişti. @sarunw bunu şöyle özetliyor: "iOS 26'da scroll edge effect varsayılanı .soft. iOS 27'de .hard." Geliştiriciler aynı şeyi kendi uygulamalarında gördü. Shellbee projesi, bir iOS 27 build'inden sonra uygulamadaki bar'lar düzleşince bir hata kaydı açtı; DevelopersIO da özel bir safeAreaBar için aynısını buldu. Tam olarak söylemek gerekirse varsayılan hâlâ .automatic; değişen, onun neye çözümlendiği. DevelopersIO ayrıca Xcode 26.6 ile derlenip iOS 27'de çalıştırılan bir uygulamanın eski görünümü koruduğunu bildiriyor; yani değişiklik derlediğiniz SDK'yı takip ediyor. Yazarı, iOS 27 veya Xcode 27 sürüm notlarında bununla ilgili bir şey bulamadı.
Stillerin kendisi değişti. @sarunw, .hard'ın iki sürümde aynı olmadığını belirtiyor. iOS 26'da neredeyse opak bir bar ve arkasındaki metin okunamıyor. iOS 27'de kesme çizgisi kalıyor ama içerik hâlâ arkadan görünüyor. Dark Mode'da da aynı ayrımı tarif ediyor: .soft solar, .hard keser ve iOS 27 stili daha dengelidir. Apple .soft'u da değiştirdi. Geliştirici forumlarında bir Apple mühendisi ".soft stilinin iOS 27'de önemli ölçüde değiştiğini" yazdı.
| iOS 26 | iOS 27 | |
|---|---|---|
Üstte .automatic, geliştirici raporlarına göre | Soft'a çözümlenir | Hard'a çözümlenir |
.hard görünümü, @sarunw'ya göre | Neredeyse opak; arkadaki metin okunamaz | Bir kesme çizgisi; içerik arkadan görünür |
.soft görünümü | Bulanıklık ve solma | Apple mühendisine göre yeniden tasarlandı |
Neden bu değişiklik? Apple bunu açıkça söylemedi. Aynı forum yanıtı, birçok uygulamanın .automatic'in daha uygun olacağı yerlerde açıkça .soft'u seçtiğini ve .soft'un "işletim sisteminin varsayılanı olmadığını" belirtiyor.
iOS 26'daki scroll edge geçişini iOS 27'de nasıl geri getiririm?
Tasarımınız bu geçişe bağlıysa onu açıkça isteyin. @sarunw'nun çözümü tek bir modifier:
List(items) { item in
ItemRow(item: item)
}
.scrollEdgeEffectStyle(.soft, for: .top)
iOS 26 öncesi sürümleri hâlâ destekliyorsanız, tek bir çağrıyla her yere uygulayabilmek için onu bir availability kontrolüne sarın:
extension View {
@ViewBuilder
func softTopScrollEdge() -> some View {
if #available(iOS 26.0, *) {
scrollEdgeEffectStyle(.soft, for: .top)
} else {
self
}
}
}
Üç uyarı var. Birincisi, Shellbee'nin düzeltme notlarına göre uygulama kökünde ayarlanan bir stil, sheet veya full-screen cover olarak sunulan NavigationStack'lere ulaşmadı; bu yüzden her birinin içinde uygulayın. İkincisi, "geri getirmek" birebir değil: .soft iOS 27'de yeniden tasarlandığından iOS 26'yla piksel piksel aynısını değil, iOS 27'nin soft görünümünü alırsınız. Üçüncüsü, Apple mühendisi tasarım ihtiyaçlarınızı karşıladığı her yerde .automatic'i öneriyor ve .soft'un her tasarıma uymayabileceğini belirtiyor.
Bir uyumluluk hatası da vardı. Bir geliştirici forumu başlığı, iOS 27 betalarında .soft'un bir safeAreaBar'ın üzerinde tamamen şeffaf göründüğünü, ancak bunun yalnızca iOS 26 SDK ile derlenen uygulamalarda olduğunu bildirdi. Apple, iOS 27.2'nin yeni .soft'u bu uygulamalara da sunacağını söyledi; başlıktaki sonraki bir gönderi de sorunun iOS 27.2 beta 4'te düzeldiğini bildiriyor. iOS 26'ya bağlı bir build yayınlıyorsanız onu iOS 27.2'de kontrol edin.
Scroll edge effect tek bir kenar için nasıl ayarlanır veya gizlenir?
scrollEdgeEffectStyle(_:for:)'ın ikinci parametresi bir Edge.Set; yani bir stilin hangi kenarlara uygulanacağını seçersiniz: tek bir kenar, birkaç kenar veya .all. DevelopersIO'nun özel alt bar'ı için yaptığı düzeltme yalnızca o kenarı hedefliyor:
ScrollView {
DayList()
}
.scrollEdgeEffectStyle(.soft, for: .bottom)
.safeAreaBar(edge: .bottom) {
DayPicker()
}
Yazarı, modifier'ın burada olduğu gibi scroll view'u saran dıştaki bir view'da durabileceğini belirtiyor.
Efekti kaldırmak için iOS 26 ile gelen scrollEdgeEffectHidden(_:for:)'ı kullanın. İki parametrenin de varsayılanı var; bu yüzden modifier'ı parametresiz kullanmak tüm kenarları gizler:
ScrollView {
PhotoGrid()
}
.scrollEdgeEffectHidden(true, for: .bottom)
Bunu yalnızca o kenarın üzerinde sabitlenmiş bir şey olmadığında veya kendi tasarımınız kontrolleri zaten okunabilir tuttuğunda gizleyin. Aksi halde cam düğmeler işlenmemiş içeriğin üzerinde kalır.
UIKit'te scroll edge effect nasıl değiştirilir?
UIKit'te de iOS 26 ile gelen aynı model var. Her UIScrollView, topEdgeEffect, bottomEdgeEffect, leftEdgeEffect ve rightEdgeEffect'i sunar. Her biri, .automatic, .soft veya .hard değerli bir style'a ve varsayılanı false olan bir isHidden bayrağına sahip bir UIScrollEdgeEffect.
tableView.topEdgeEffect.style = .soft
collectionView.bottomEdgeEffect.isHidden = true
Bir scroll view'un kenarının üzerindeki kendi view'larınız için, örneğin bir düğme satırı, Apple'ın Build a UIKit app with the new design oturumu UIScrollEdgeElementContainerInteraction kullanıyor. Böylece container'ın etiket, görsel ve kontrol gibi alt öğeleri kenar efektini şekillendirir.
let interaction = UIScrollEdgeElementContainerInteraction()
interaction.scrollView = scrollView
interaction.edge = .bottom
buttonContainer.addInteraction(interaction)
iOS 27'deki varsayılan değişikliğine dair raporların çoğu SwiftUI projelerinden geliyor; yukarıdaki forum başlığında ise .soft hatasını gören bir UIKit geliştiricisi de var. UIKit ekranlarının etkilenmediğini varsaymak yerine onları da iOS 27'de kontrol edin.
Scroll edge effect iPhone Duo'nun dikey bar'ıyla nasıl çalışır?
iPhone Duo'da iOS 27.1 SDK ile derlenen uygulamalar navigation ve toolbar öğelerini bir yan kenar boyunca uzanan dikey bir bar'a taşır. Apple'ın Raise the bar with iPhone Duo Tech Talk'u, dikey bar'ın yatay bar'larla aynı şekilde "varsayılan olarak scroll-edge efektine sahip olmadığını" ve Reduce Transparency açıkken bir arka plan aldığını söylüyor. Apple, bar'daki özel view'ları her iki durumda da okunabilir tutmanızı istiyor. Bar'ların ne zaman dikey olduğunu iPhone Duo dikey toolbar rehberimiz anlatıyor.
Apple, .leading veya .trailing ile scrollEdgeEffectStyle'ın dikey bar ile nasıl etkileştiğini belgelemiyor; bu yüzden orada varsayımlara dayanarak bir şey kurmayın. İç ekran dikeyde yatay bar'ları korur; yani .top için ayarladığınız bir stil, yatayda dikey bar gösteren aynı cihazda önemlidir. İki yönü de kontrol edin ve içeriği doğru safe area'lar ve content margin'lerle bar'dan uzak tutun.
Önemli çıkarımlar
- iOS 26 ile gelen scroll edge effect, Liquid Glass bar'larını kayan içeriğin üzerinde okunabilir tutar.
scrollEdgeEffectStyle(_:for:)ile ayarlayın,scrollEdgeEffectHidden(_:for:)ile gizleyin. .softbulanık bir sınır,.hardneredeyse opak bir sınırdır; Apple yoğun arayüzler için.hard'ı öneriyor.- Geliştiricilerin raporlarına göre iOS 27 build'leri otomatik üst efekti
.hard'a çözümlüyor ve iki stil de iOS 27'de farklı görünüyor. - Geçişi korumak için, modal
NavigationStack'lerin içi de dahil olmak üzere.scrollEdgeEffectStyle(.soft, for: .top)uygulayın. - UIKit'te her
UIScrollViewkenarındatopEdgeEffect.styleveisHiddenkullanın. - iPhone Duo'da dikey bar'ların varsayılan olarak scroll edge effect'i yoktur; bu yüzden iki yönü de kontrol edin.
iOS 26 toolbar'larının öğelerini nasıl grupladığı ve biçimlendirdiği hakkında daha fazlası için Liquid Glass için SwiftUI toolbar rehberimizi okuyun. Cihazdan zaten en iyi şekilde yararlanan uygulama ve oyunları görmek için Built for the fold sayfasına göz atın.
Sık sorulan sorular
SwiftUI'da scroll edge effect nedir?
iOS 26'nın toolbar'ların ve diğer sabitlenmiş kontrollerin altından kayan içeriğe uyguladığı, kontrollerin okunabilir kalmasını sağlayan işlemdir. SwiftUI bunu otomatik uygular; scrollEdgeEffectStyle(_:for:) ile değiştirir, scrollEdgeEffectHidden(_:for:) ile kaldırırsınız.
.soft ile .hard arasındaki fark nedir?
Apple .soft'u sabitlenmiş kontroller ile kayan içerik arasında ince, bulanık bir sınır; .hard'ı ise doğrusal, neredeyse opak bir sınır olarak tanımlıyor. Apple çok sayıda yüzen öğe içeren yoğun arayüzler için .hard'ı öneriyor.
Toolbar'ım iOS 27'de neden opak görünüyor?
Geliştiricilerin raporlarına göre bir uygulama iOS 27 SDK ile derlendiğinde otomatik üst scroll edge effect, iOS 26'daki .soft geçiş yerine .hard'a çözümleniyor. Apple'ın sürüm notları bundan bahsetmiyor; bu yüzden belirli bir görünüme bağlıysanız stili açıkça ayarlayın.
iOS 26'daki scroll edge geçişini iOS 27'de nasıl geri getiririm?
Scroll view'a veya onu saran bir container'a .scrollEdgeEffectStyle(.soft, for: .top) uygulayın. Sheet veya full-screen cover olarak sunduğunuz her NavigationStack'in içinde de uygulayın, çünkü geliştiricilere göre modal stack'ler bunu kökten devralmıyor.
UIKit'te scroll edge effect nasıl değiştirilir?
Her UIScrollView'un topEdgeEffect, bottomEdgeEffect, leftEdgeEffect ve rightEdgeEffect özellikleri vardır. Bir kenarın stilini .soft, .hard veya .automatic yapın ya da kaldırmak için isHidden'ı true yapın.
Kaynaklar
- scrollEdgeEffectStyle(_:for:) · Apple Developer Documentation
- ScrollEdgeEffectStyle · Apple Developer Documentation
- scrollEdgeEffectHidden(_:for:) · Apple Developer Documentation
- safeAreaBar(edge:alignment:spacing:content:) · Apple Developer Documentation
- UIScrollEdgeEffect · Apple Developer Documentation
- UIScrollEdgeElementContainerInteraction · Apple Developer Documentation
- Build a SwiftUI app with the new design · Apple Developer (WWDC25)
- Build a UIKit app with the new design · Apple Developer (WWDC25)
- Raise the bar with iPhone Duo · Apple Developer
- iOS 27 beta 1: .scrollEdgeEffectStyle(.soft) renders fully transparent above safeAreaBar · Apple Developer Forums
- Xcode 27: safeAreaBar's effect changed to the equivalent of hard · DevelopersIO (Classmethod)
- iOS 27 changes scroll-edge toolbar default from soft to hard · Shellbee on GitHub
- In iOS 26, the scroll edge effect default is .soft. In iOS 27, it is .hard · @sarunw on X
- .hard is not the same on iOS 26 and iOS 27 · @sarunw on X
- Same scroll edge styles in Dark Mode · @sarunw on X
- Want the iOS 26 scroll edge fade back on iOS 27? · @sarunw on X
Katlanmayı uygulamanızın bir parçası yapın.
iPhone Duo ile gerçekten bir şey yapan uygulama ve oyunları tanıtıyoruz. App Store bağlantısıyla sizinkini gönderin ya da diğer geliştiricilerin neler yaptığına bakın.