iOS 27 beta 1: .scrollEdgeEffectStyle(.soft) renders fully transparent above safeAreaBar

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.

iOS 27 beta 1: .scrollEdgeEffectStyle(.soft) renders fully transparent above safeAreaBar
 
 
Q