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.