Provide views, controls, and layout structures for declaring your app's user interface using SwiftUI.

SwiftUI Documentation

Posts under SwiftUI subtopic

Post

Replies

Boosts

Views

Activity

Mitigating overlapping text for sticky section headers for a plain List in iOS 26
When preparing SwiftUI code that uses List with .listStyle(.plain) for iOS 26, the by-default sticky section headers combined with the new translucent top-bars often causes unpleasantly overlapping text: Two questions here: Is there a modifier to make section headers non-sticky? This would be helpful for cases where the translucent bar is a good fit and the section titles don't need to be sticky/pinned. I found .listStyle(.grouped) can be an alternative in some cases, but this adds a gray background / additional padding to the section titles. Is there a way to get a blurry material behind the section headers when they are sticking to the top bar? This would be good for cases where the section header is important content-wise (like in the two-column example above or for a data list categorized using sections that should be always visible as a point of reference) I found the scroll edge effects and .scrollEdgeEffectStyle(.hard, for: .top) does the trick for the top bar but doesn't affect attached sticky section headers (maybe it should?). Also I played around with .toolbarBackground(...) but this didn't do anything useful for a nav bar in my experiments.
Topic: UI Frameworks SubTopic: SwiftUI
5
0
129
Jul ’25
ProductView failed to trigger purcahse flow.
Hi, My app has an IAP and the view that let user to purchase is simply a ProductView. The purchase flow should be handled by the ProductView itself. I have tested the app with xcode storekit configuration, xcode run with sandbox account and also TestFlight environment as well. The purchase is triggered and the app feature is unlocked after purchase. However, I keep getting app review team feedback with the following problem: Bug description: the purchase button is greyed out after we tapped on it, however, there's no purchase flow popped up I have tried multiple things. Building with xcode cloud, removing the storekit configuration from the build scheme. But none can get the app review team to get through the problem. The IAP is not available in certain region. In that case, the app will show a message. However, the app review attached an screenshot which shows the product view. The view that allow users to purchase if let product = store.products.first(where: { $0.id == "com.xxx.xxxxxxx" }) { // If the product is available, show the ProductView ProductView(id: product.id) .productViewStyle(.compact) } else { // If the product is not available, show a message Text("In-app purchase is not available in your region.") } The store class @Published private(set) var products: [Product] = [] ... init() { //To handle the parental approval flow getUpdateTransaction() } func getUpdateTransaction() { updates = Task { for await update in StoreKit.Transaction.updates { if let transaction = try? update.payloadValue { await fetchActiveTransactions() await transaction.finish() } } } } Does anyone what can go wrong with ProductView? As this is part of the StoreKit API, I don't know what can go wrong. At least the purchase flow should be covered by it. Also, is sandbox and TestFlight a good way to test IAP? Thanks!
1
0
50
Jul ’25
How to opt out of tinting content in visionOS widgets
During the WWDC Session called "Design widgets for visionOS" the presenter says: You can choose whether the background of your widget participates in tinting. If you opted out, for example to preserve a photo or illustration, make sure it still looks good alongside the selected color palette. https://developer.apple.com/videos/play/wwdc2025/255 Unfortunately, this session has no example code. Can someone point me to the correct way to do this? Is there a modifier we can use on views? When a user selects one the tint colors using the configuration screen, we would like to prevent some views from being tinted.
0
0
58
Jul ’25
Hide search field always
Greetings, Please type slowly, I'm new at this. iOS 18.x. Added search to a list, visibility toggled with a toolbar button, using this line of code: .searchable(text: $searchText, isPresented: $isSearchPresented, placement: .navigationBarDrawer(displayMode: .automatic), prompt: "Search...") Realized I was re-stating defaults, changed it to this: .searchable(text: $searchText, isPresented: $isSearchPresented, prompt: "Search...") In both cases, it works great when in the middle of the list, just like I wanted. However, when I scroll to the top of the list, the serach field is displayed even when 'isPresented' is false. Is there any way to keep the search field hidden even at the top of the list? ..thanks!
Topic: UI Frameworks SubTopic: SwiftUI Tags:
2
0
106
Jul ’25
iOS26: Programmatically Minimize TabView
In our app we have a view with a custom scroll implementation in a TabView. We would like to programmatically minimize (not hide) the TabView, like .tabBarMinimizeBehavior(...) does when a List is behind the tab bar and a user scrolls. I haven't found any view modifier that I can attach that allows me to do so, is this not possible? I would have expected something like .tabBarMinimized($tabBarMinimized)
Topic: UI Frameworks SubTopic: SwiftUI
0
0
83
Jul ’25
iOS26 - search
I have several locations in my app where the user can search. He can search within the apps content or search for content from the web to add to the app. i would like to use the tab view search box for both, but I don’t know how to do that. I currently have a tab with value search for the „web search“ and a list with .searchable for the in app content. The later one adds the search bar on top of the list. W hat’s the best way to modify this behavior?
Topic: UI Frameworks SubTopic: SwiftUI
0
0
134
Jul ’25
tvOS 18.5 SwiftUI Siri Remote click issue
Hi everyone! I'm building a tvOS 18.5 app using SwiftUI in Xcode 16.4, and I'm having trouble reliably detecting button clicks from the 2nd generation Siri Remote. .onMoveCommand(perform: handleMoveCommand) func handleMoveCommand(_ direction: MoveCommandDirection) { switch direction { case .right: nextQuote() case .left: previousQuote() default: break } } Swiping left or right on the remote's touch surface works as expected, the callback fires every time. However, when I press the physical left/right buttons (outside the touch surface), the input is unreliable. Sometimes it registers, other times I need to press multiple times or nothing happens at all. I’ve confirmed the view is .focusable(true) and bound with @FocusState. Is this a known limitation or bug with .onMoveCommand on recent tvOS versions? Or is there a more robust way to handle physical Siri Remote button presses?
Topic: UI Frameworks SubTopic: SwiftUI Tags:
1
2
99
Jul ’25
MapKit Not Updating MapContentBuilder after each mapCameraKeyframeAnimator keyframe
Hello Apple support, I have this following code Map(position: $mCam, selection: $lastSelection) { // Display content conditionally based on camera scope. // ^^^ works with user gesture, does not work with mapCameraKeyframeAnimator } .onMapCameraChange(frequency: .continuous , { context in // save the camera scope }) .mapCameraKeyframeAnimator(trigger: self.trigger, keyframes: { camera in // frames }) Context: when logging, the .onMapCameraChange is updating. The content mapContentBuilder is running. But the content is NOT showing up on the map. MapCircle, MapPolyline does not show! however, Marker works just fine Question: Anyone know How to indicate to MapKit Map view to draw the content? Or how to have a slight "break" between animation keyframes, so map can catch up.
2
0
72
Jul ’25
Problem with multiple drag and drop
I have been trying to get the drag and drop to work on iOS 26 betas. Single drag is okay, but I thought this year we were getting multi-select drag added. creating a simple object that can be dragged. Using the .draggable and added dropDestination which does trigger. The problem is the dragContainer does nothing. Not really clear what it is supposed to do. How am I supposed to allow for multiple item drag and drop like the Photos app? In there you can start a drag and tap additional photos to add to the drag. I can do this with a UICollectionView, but not with SwiftUI. struct DragObject: Codable, Identifiable, Transferable { var index: Int enum Keys: String, CodingKey { case index } var id:Int { index } public func encode(to encoder: any Encoder) throws { var container = encoder.container(keyedBy: Keys.self) try container.encode(self.index, forKey: .index) } static public var transferRepresentation: some TransferRepresentation { CodableRepresentation(contentType: .json) } } @available(iOS 26.0, *) struct DragDropTestView: View { @State var items : [DragObject] = (0..<100).map({ DragObject(index: $0) }) @State var selected : [DragObject.ID] = [] var body: some View { let _ = Self._printChanges() ScrollView { Text("Selected \(selected)") LazyVGrid(columns: [GridItem(.adaptive(minimum: 150, maximum: 180))], alignment: .center, spacing: 10) { ForEach(items, id: \.index) { item in VStack { Text("\(item.index)") } .frame(width: 100, height: 100) .padding() .background(Color.blue) .cornerRadius(8) .contentShape(.dragPreview, Circle()) .draggable(item) .dropDestination(for: DragObject.self) { draggedItems, session in print("Dragged Item Count: \(draggedItems.count)") } } } } .dragContainer(for: DragObject.self, selection: selected){ ids in dragItems(ids: ids) } } func dragItems(ids: [Int]) -> [DragObject] { return ids.map({ DragObject(index: $0)}) } }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
0
0
183
Jul ’25
Adaptive automatic corner radius in containers with insets/paddings
With the correct corner radius changing in iOS 26, I wondered if there is a way to get properly rounded corners inside containers like sheets without hard-coding a constant value. Here's the results of some experiments I did, example code below. The new in Beta 4 ConcentricRectangle seems nice. Notable here is that it doesn't pick up the larger corner radii from the device corners: If you want all the corners rounded, the isUniform parameter of ConcentricRectangle seems helpful. It doesn't apply the corners in a View in the middle though, not sure if this is an oversight or if this has some purpose: ContainerRelativeShape looks ... interesting ... as of Beta 4, with the larger bottom corners rounded according to the device corners, but the actual bottom corners not fitting the device corners. With ContainerRelativeShape one can also get the middle part to have proper rounded corners in this example ... if you set the outer .containerShape(RoundedRectangle(cornerRadius: 36)) yourself. Notable here is that it then actually adapts all corners of the last card to the larger device corner radius - why it does that even with the smaller radius being explicitly set as containerShape is beyond my imagination. ContainerRelativeShape and ConcentricRectangle both feel quite similar to me, but different in ways that are not clear to me after reading the documentation. I wouldn't know when to pick which / I am not sure if these two should really be two separate things... Any insights here? I was also hoping to find a way to read the cornerRadius (both device corner radius and sheet container radius) for more complex custom-shaped views, but currently there seems no way to do that. The new in iOS 26 Beta 4 GeometryReader containerCornerInsets sounded a bit like it, but it seems of no use here, it's always zero. docs talk about windowing controls and values can be seen on iPad when the red/yellow/green window buttons become visible, so it seems unrelated here. Example code AdaptiveCorners.swift import SwiftUI enum Experiment: String, CaseIterable, Identifiable { case form case concentricRect case uniformConcentricRect case containerRelative case containerRelativeWithContainerShape case containerCornerInsets var title: String { self.rawValue } var id: String { self.rawValue } } struct ContentView: View { @State var experiment : Experiment? = .concentricRect var body: some View { NavigationStack { Form { Picker("Experiment", selection: $experiment) { ForEach(Experiment.allCases, id: \.self) { experiment in Text(experiment.title).tag(experiment) } } .pickerStyle(.inline) } } .sheet(item: $experiment) { experiment in Group { switch(experiment) { case .form: Form { Section { Text("Form + Section") Text("Form + Section") } } case .concentricRect: ShapeView { ConcentricRectangle() } case .uniformConcentricRect: ShapeView { ConcentricRectangle(corners: .concentric, isUniform: true) } case .containerRelative: ShapeView { ContainerRelativeShape() } case .containerRelativeWithContainerShape: ShapeView { ContainerRelativeShape() } .containerShape(RoundedRectangle(cornerRadius: 36)) case .containerCornerInsets: GeometryReader { geometry in Form { Text(String(describing: geometry.containerCornerInsets)) } } } } .presentationDetents([.medium, .large]) } } } struct ShapeView<S : Shape> : View { @ViewBuilder let content: () -> S var body: some View { ScrollView([.vertical]) { VStack { HStack { content() .fill(Color.yellow) .frame(height: 80) .frame(maxWidth: .infinity) content() .fill(Color.orange) .frame(height: 80) .frame(maxWidth: .infinity) } content() .fill(Color.green) .frame(height: 80) .frame(maxWidth: .infinity) } .padding() } } } #Preview { ContentView() }
Topic: UI Frameworks SubTopic: SwiftUI
3
0
483
Jul ’25
Why my font size is not scaling dynamically
Hello everyone, I am having an issue where the attributed text that I have in my UITextView is not scaling dynamically with phone text size, whenever I remove the attributed text logic, it scales fine, however, with it, it stays at a set font size. struct AutoDetectedClickableDataView: UIViewRepresentable { let text: String @Binding var height: CGFloat func makeUIView(context: Context) -> UITextView { let textView = UITextView() textView.dataDetectorTypes = [.phoneNumber, .address, .link] textView.isEditable = false textView.isScrollEnabled = false textView.backgroundColor = .clear textView.font = UIFont.preferredFont(forTextStyle: .body) /*UIFontMetrics(forTextStyle: .body).scaledFont(for: UIFont.systemFont(ofSize: 16.0)) */ textView.adjustsFontForContentSizeCategory = true textView.textContainer.lineBreakMode = .byWordWrapping textView.textContainerInset = .zero textView.textContainer.lineFragmentPadding = 0 textView.translatesAutoresizingMaskIntoConstraints = false textView.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) textView.setContentHuggingPriority(.defaultHigh, for: .horizontal) return textView } func updateUIView(_ uiView: UITextView, context: Context) { let attributed = NSMutableAttributedString(string: text, attributes: [ .font: UIFont.preferredFont(forTextStyle: .body) ]) let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.address.rawValue | NSTextCheckingResult.CheckingType.link.rawValue | NSTextCheckingResult.CheckingType.phoneNumber.rawValue) detector?.enumerateMatches(in: text, options: [], range: NSRange(location: 0, length: text.utf16.count)) { match, _, _ in guard let match = match else { return } attributed.addAttributes([ .foregroundColor: UIColor.systemBlue, .underlineStyle: NSUnderlineStyle.single.rawValue, ], range: match.range) } uiView.attributedText = attributed // uiView.text = text DispatchQueue.main.async { uiView.layoutIfNeeded() let fittingSize = CGSize(width: uiView.bounds.width, height: .greatestFiniteMagnitude) let size = uiView.sizeThatFits(fittingSize) height = size.height } } }
1
0
325
Jul ’25
how to change the textfield background on click focused
i am using this code but no works @FocusState private var focus: FormFieldFocus? let db = getDatabaseConnection() var body: some View { VStack { Group { Text("Item Num:").padding(1) TextField("Item Num", text: $intemNum) .textFieldStyle(.roundedBorder) .onSubmit {focus = .despTxt} .focused($focus, equals: .itemTxt) .background(focus ? Color.yellow.opacity(0.3) : Color.clear) .cornerRadius(10)
Topic: UI Frameworks SubTopic: SwiftUI
2
0
160
Jul ’25
tabBarMinimizeBehavior not working if subview has TabView with .tabViewStyle(.page)
We are using a TabView as the TabBarController in our app for main navigation. On one of the tabs we have a view that consists of a TabView with .tabViewStyle(.page) in order to scroll horizontally between pages inside of that specific tab. The .tabBarMinimizeBehavior(.onScrollDown) works on all the other TabItem views, but for this one it does not recognise any vertical scrolling in any of the pages, in order to minimize the TabBar. I believe this is a bug? If we don't wrap the views inside the TabView with .page style, we are able to get the expected behaviour using the tabBarMinimizeBehavior. Please let us know if this is going to be fixed in a future iOS 26 beta release.
0
3
119
Jul ’25
glassEffect modifier makes DragGesture no longer work
I have the following SwiftUI code for a draggable UI. private var onTouchDownGesture: some Gesture { DragGesture(minimumDistance: 0) .onChanged { value in isDragging = true updateYTranslation(value.translation.height) } .onEnded { value in isDragging = false updateYTranslation(value.translation.height) } } var body: some View { VStack { Image(systemName: "chevron.up") Spacer() .frame(height: 16) Image(systemName: "chevron.down") } .padding() .gesture(onTouchDownGesture) .glassEffect(.regular.interactive(false)) } } I find that if I use glassEffect modifier, then the drag gesture will not work. However, if i change it glasseffectto other kinds of background like .background(Capsule()), then the drag gesture works as expected. Is this a known issue of glassEffect or am I using it incorrectly?
1
0
186
Jul ’25
Liquid Glass Error
Hello everyone. I'm getting an error in my code and I don't know why. Can someone explain it to me? import SwiftUI struct ContentView: View{ var body: some View{ VStack { Button {} label: { Text("Click Me") } .buttonStyle(.glass) .frame(width: 200, height: 200) } } } The error is as follows: Reference to member 'glass' cannot be resolved without a contextual type Thanks for your help
1
0
197
Jul ’25
How to replicate Mail toolbar
The toolbar in the the Mail app uses seems to force a .soft scrollEdgeEffectStyle, however I can't seem to reproduce this. Even when putting .scrollEdgeEffectStyle(.soft, for: .top) all over my code, a NavigationSplitView seems to force a "classic" toolbar. Example, top is the mail app, bottom is my swiftUI app:
0
0
132
Jul ’25
Shield Configuration For ManagedSettingsUI not applying for Category Selections
So when we select an app that needs to have a shield configured for family controls (managed settings), when selecting an individual application (say like Instagram), it works well but when I select a whole category (say like Social) it doesn't work well. here's the exact code for how I choose which application needs to be shielded: class ShieldConfigurationExtension: ShieldConfigurationDataSource { override func configuration(shielding application: Application) -> ShieldConfiguration { return ShieldConfiguration( backgroundBlurStyle: .systemChromeMaterial, backgroundColor: UIColor(red: 220.0/255, green: 20.0/255, blue: 60.0/255, alpha: 1.00), icon: iconImage, title: ShieldConfiguration.Label(text: "You CAN'T give up now!", color: .white), subtitle: ShieldConfiguration.Label(text: "Just a little bit more you got this", color: .white), primaryButtonLabel: ShieldConfiguration.Label(text: "GRINDSET", color: .white), primaryButtonBackgroundColor: .black, secondaryButtonLabel: ShieldConfiguration.Label(text: "Move Fast", color: .black) ) } Now this works well for application selection alone, but there isn't any for category selection as such. And the same is shown in its execution that a category goes back to default shielding. What API should I use for category shielding?
1
0
177
Jul ’25