Feedback ID: FB23086400
On iOS 27 beta 1, .scrollEdgeEffectStyle(.soft, for: .top) on a List underneath a custom .safeAreaBar(edge: .top) no longer renders the progressive fade-blur. The top edge is fully transparent — scrolled rows pass under the bar with no visual treatment at all, as if scrollEdgeEffectDisabled() had been applied.
What I've verified so far:
- .hard renders correctly in the exact same hierarchy; only .soft is affected.
- The same binary works correctly on iOS 26.x Xcode preview. I'm building with Xcode 26.3 (iOS 26 SDK).
Minimal reproduction:
import SwiftUI
struct EdgeEffectRepro: View {
enum Style: String, CaseIterable, Identifiable {
case automatic, soft, hard
var id: Self { self }
var value: ScrollEdgeEffectStyle {
switch self {
case .automatic: .automatic
case .soft: .soft
case .hard: .hard
}
}
}
@State private var style: Style = .soft
@State private var useSystemBarOnly = false
var body: some View {
NavigationStack {
List(0..<60, id: \.self) { i in
Text("Row \(i)")
.frame(maxWidth: .infinity, alignment: .leading)
.listRowBackground(
i.isMultiple(of: 2)
? Color.orange.opacity(0.45)
: Color.teal.opacity(0.45)
)
}
.scrollIndicators(.hidden)
.scrollEdgeEffectStyle(style.value, for: .top)
.safeAreaBar(edge: .top) {
if !useSystemBarOnly {
VStack(spacing: 8) {
HStack {
Text("Custom Top Bar")
.font(.system(size: 28, weight: .bold))
Spacer()
}
HStack {
Text("Second row (e.g. date range picker)")
.font(.caption)
.foregroundStyle(.secondary)
Spacer()
}
}
.padding(.horizontal)
}
}
.safeAreaInset(edge: .bottom) {
VStack(spacing: 8) {
Picker("Edge effect style", selection: $style) {
ForEach(Style.allCases) { Text($0.rawValue).tag($0) }
}
.pickerStyle(.segmented)
Toggle("System bar only (control group)", isOn: $useSystemBarOnly)
.font(.caption)
}
.padding()
.background(.regularMaterial)
}
.navigationTitle("EdgeEffect Repro")
.navigationBarTitleDisplayMode(.inline)
}
}
}
Steps: run on iOS 27 beta 1, set the picker to soft, scroll rows under the bar.
Expected: fade-blur as on iOS 26.
Actual: fully transparent. Switch to hard: renders fine.
Hi Folks,
As you know the scroll edge effect changed drastically in iOS 27 and one of the issues that came up during that development was a lot of clients that were making explicit use of the .soft effect when .automatic would have been more appropriate. As the .soft style changed radically in iOS 27 this ended up creating issues in some clients linked against iOS 26 that we resolved by using a style that better fit their expectations. However as iOS 27 approached release, many things changed and what you see is the result of that change.
Our primary recommendation is still to prefer .automatic where it meets your design requirements. This will ensure that your design evolves with the OS design going forward. Specifically in iOS 27, the design that you get by specifying .soft is not available from .automatic and why we did not vend it to iOS 26 linked apps in iOS 27.
With that said, we have made a change in a future iOS 27.2 beta that will result in the iOS 27 .soft style being available to iOS 26 linked apps that request the .soft style explicitly. Please keep in mind that this style not selected by the OS by default and thus may still not fulfill your design needs in certain circumstances – evaluating if you explicitly want this style is still critical to a good design.
Thank you all for your feedback, and apologies for any churn this has caused you. Good luck on your updates!