Explore the various UI frameworks available for building app interfaces. Discuss the use cases for different frameworks, share best practices, and get help with specific framework-related questions.

All subtopics
Posts under UI Frameworks topic

Post

Replies

Boosts

Views

Activity

UICollectionView Dequeue Crash Xcode 16.2
I am facing same issue with major crash while coming out from this function. Basically using collectionView.dequeReusableCell with size calculation. func getSizeOfFavouriteCell(_ collectionView: UICollectionView, at indexPath: IndexPath, item: FindCircleInfoCellItem) -> CGSize { guard let dummyCell = collectionView.dequeueReusableCell( withReuseIdentifier: TAButtonAddCollectionViewCell.reuseIdentifier, for: indexPath) as? TAButtonAddCollectionViewCell else { return CGSize.zero } dummyCell.title = item.title dummyCell.subtitle = item.subtitle dummyCell.icon = item.icon dummyCell.layoutIfNeeded() var targetSize = CGSize.zero if viewModel.favoritesDataSource.isEmpty.not, viewModel.favoritesDataSource.count > FindSheetViewControllerConstants.minimumFavoritesToDisplayInSection { targetSize = CGSize(width: collectionView.frame.size.width / 2, height: collectionView.frame.height) var estimatedSize: CGSize = dummyCell.systemLayoutSizeFitting(targetSize) if estimatedSize.width > targetSize.width { estimatedSize.width = targetSize.width } return CGSize(width: estimatedSize.width, height: targetSize.height) } } We have resolve issue with size calculation with checking nil. Working fine in xcode 15 and 16+. Note: Please help me with reason of crash? Is it because of xCode 16.2 onwards **strict check on UICollectionView **
0
0
155
Apr ’25
UIInputView not being deallocated
I am experiencing memory leaks in my iOS app that seem to be related to an issue between UIInputView and _UIInputViewContent. After using the memory graph, I'm seeing that instances of these objects aren't being deallocated properly. The UIInputViewController whichs holds the inputView is being deallocated properly along with its subviews.I have tried to remove all of UIInputViewController's subviews and their functions but the uiInputView is not being deallocated. The current setup of my app is a collectionView with multiple cell,each possessing a textfield with holds a UIInputViewController.When i scroll up or down,the views are being reused as expected and the number of UIInputViewController stays consistent with the number of textfields.However the number of inputView keeps increasing referencing solely _UIInputViewContent. class KeyboardViewController: UIInputViewController { // Callbacks var key1: ((String) -> Void)? var key2: (() -> Void)? var key3: (() -> Void)? var key4: (() -> Void)? private lazy var buttonTitles = [ ["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"] ] override func viewDidLoad() { super.viewDidLoad() setupKeyboard() } lazy var mainStackView: UIStackView = { let mainStackView = UIStackView() mainStackView.axis = .vertical mainStackView.distribution = .fillEqually mainStackView.spacing = 16 mainStackView.translatesAutoresizingMaskIntoConstraints = false return mainStackView }() private func setupKeyboard() { let keyboardView = UIView(frame:CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 279.0)) keyboardView.addSubview(mainStackView) NSLayoutConstraint.activate([ mainStackView.topAnchor.constraint(equalTo: keyboardView.topAnchor, constant: 16), mainStackView.leadingAnchor.constraint(equalTo: keyboardView.leadingAnchor, constant: 0), mainStackView.trailingAnchor.constraint(equalTo: keyboardView.trailingAnchor, constant: -24), mainStackView.bottomAnchor.constraint(equalTo: keyboardView.bottomAnchor, constant: -35) ]) // Create rows for (_, _) in buttonTitles.enumerated() { let rowStackView = UIStackView() rowStackView.axis = .horizontal rowStackView.distribution = .fillEqually rowStackView.spacing = 1 // Create buttons for each row for title in rowTitles { let button = createButton(title: title) rowStackView.addArrangedSubview(button) } mainStackView.addArrangedSubview(rowStackView) } self.view = keyboardView } private func createButton(title: String) -> UIButton { switch title { ///returns a uibutton based on title } } // MARK: - Button Actions @objc private func numberTapped(_ sender: UIButton) { if let number = sender.title(for: .normal) { key1?(number) } } @objc private func key2Called() { key2?() } @objc private func key3Called() { key3?() } @objc private func key4Called() { key4?() } deinit { // Clear any strong references key1 = nil key2 = nil key3 = nil key4 = nil for subview in mainStackView.arrangedSubviews { if let stackView = subview as? UIStackView { for button in stackView.arrangedSubviews { (button as? UIButton)?.removeTarget(self, action: nil, for: .allEvents) } } } mainStackView.removeFromSuperview() } } Environment iOS 16.3 Xcode 18.3.1 Any insights would be greatly appreciated as this is causing noticeable memory growth in my app over time.
0
0
80
Apr ’25
App Name Display
For now, my app name length is more than 20 characters, so the iPhone app name displays without a space, and uses the range operator to ensure showing the rest in the next line. Is it possible to show space and name with 2 lines?
Topic: UI Frameworks SubTopic: General Tags:
0
0
84
May ’25
Dynamic island not displaying UI views
i finally got previews for dynamic island to work and I'm just trying to first work on adding a static UI elements to my dynamic island like i did for my live screen live activity, but my dynamic island view is showing up totally empty, if i add my app icon image to the compact leading closure, it doesn't appear, if i ad text to an expanded region closure it doesn't appear. am really stuck on this and would approeciate the help. var body: some View { Image("dynamicrep") .resizable() .scaledToFit() .clipShape(.circle) } } struct DynamicRepLiveActivity: Widget { var body: some WidgetConfiguration { ActivityConfiguration(for: DynamicRepAttributes.self) { context in VStack { HStack(spacing: 257) { Text("from \(context.attributes.titleName ?? "no title")") .fontWeight(.light) .font(.system(size: 16)) .foregroundStyle(Color.gray) Circle() .frame(width: 53, height: 50) .foregroundStyle(Color.gray).opacity(0.23) .overlay { Image("mmicon") } } .frame(maxWidth: 500, maxHeight: 210) Spacer() Text("\(context.attributes.contentBody ?? "no content")") } .activityBackgroundTint(Color.cyan) .activitySystemActionForegroundColor(Color.black) .frame(width: 500, height: 300) } dynamicIsland: { context in DynamicIsland { // Expanded UI goes here. Compose the expanded UI through // various regions, like leading/trailing/center/bottom DynamicIslandExpandedRegion(.leading) { Text("from \(context.attributes.titleName ?? "no title")") } DynamicIslandExpandedRegion(.trailing) { Circle() } DynamicIslandExpandedRegion(.bottom) { Text("\(context.attributes.contentBody ?? "no content")") } } compactLeading: { AppLogo() } compactTrailing: { Text("") //empty for now } minimal: { Text("hello") //empty for now } .widgetURL(URL(string: "MuscleMemory.KimchiLabs.com")) .keylineTint(Color.white) } } }
1
0
149
Apr ’25
How to create a QuickTime recording like panel?
QuickTime recording palette behaves in a way which I want to replicate in my desktop app - specifically the behaviour when switching spaces, it appears on top. Currently, my app appears on all spaces, and even over fullscreen applications BUT it already exists when I switch to the space, this feels disjointed. I can't find a solution to this behaviour. Here's the Window Collection Behaviours I've tried (on an NSPanel): FullScreenAuxiliary - appears over fullscreen apps. CanJoinAllSpaces - appears on all spaces. These two options make the dock show up on all spaces in the same position, but on each space they already exists. I've tried this behaviour too: MoveToActiveSpace - which as per docs would move the window into active space only when its reopened, mine stays open all the time. I can't find any more information on how QuickTime achieves this.
Topic: UI Frameworks SubTopic: SwiftUI
0
0
73
May ’25
[iOS 18 Only] Intermittent Crash at completeTransition in Custom Navigation Animation (Firebase Crashlytics)
Hi everyone, I'm encountering an intermittent crash on iOS 18 only (not reproducible locally, reported in Firebase Crashlytics) at transitionContext.completeTransition(!transitionContext.transitionWasCancelled) within my custom UIViewControllerAnimatedTransitioning. The same code runs fine on iOS 16 and 17 (no Crashlytics report for those iOS version) Here's the crash log: Crashed: com.apple.main-thread 0 libswiftCore.dylib 0x4391f0 swift_getObjectType + 40 1 ROOM 0x490c48 ItemDetailAnimator.navigationController(_:animationControllerFor:from:to:) + 47 (ItemDetailAnimator.swift:47) 2 ROOM 0x490f3c @objc ItemDetailAnimator.navigationController(_:animationControllerFor:from:to:) + 92 (<compiler-generated>:92) 3 UIKitCore 0xa2d7a4 -[UINavigationController _customTransitionController:] + 516 4 UIKitCore 0x2e51dc -[UINavigationController _immediatelyApplyViewControllers:transition:animated:operation:] + 2620 5 UIKitCore 0x1541d4 __94-[UINavigationController _applyViewControllers:transition:animated:operation:rescheduleBlock:]_block_invoke + 100 6 UIKitCore 0x150768 -[UINavigationController _applyViewControllers:transition:animated:operation:rescheduleBlock:] + 776 7 UIKitCore 0x2e7e44 -[UINavigationController pushViewController:transition:forceImmediate:] + 544 8 UIKitCore 0x2e4230 -[UINavigationController pushViewController:animated:] + 444 9 ROOM 0x66cb04 UINavigationController.pushViewController(_:animated:completion:) + 185 (UINavigationController+Room.swift:185) 10 ROOM 0x8cef4c ItemDetailCoordinator.start(animated:completion:) + 99 (ItemDetailCoordinator.swift:99) 11 ROOM 0xc6c95c protocol witness for Coordinator.start(animated:completion:) in conformance BaseCoordinator + 24 (<compiler-generated>:24) 12 ROOM 0x8ca520 AppCoordinator.startCoordinator(_:url:reference:animated:completion:) + 729 (AppCoordinator.swift:729) 13 ROOM 0x8cb248 protocol witness for URLSupportCoordinatorOpener.startCoordinator(_:url:reference:animated:completion:) in conformance AppCoordinator + 48 (<compiler-generated>:48) 14 ROOM 0xd6166c URLSupportCoordinatorOpener<>.open(url:openingController:reference:animated:completion:) + 118 (URLSupportedCoordinator.swift:118) 15 ROOM 0xc56038 RRAppDelegate.handleURL(url:completion:) + 588 (RRAppDelegate.swift:588) 16 ROOM 0xc502d0 RRAppDelegate.applicationDidBecomeActive(_:) + 330 (RRAppDelegate.swift:330) 17 ROOM 0xc5041c @objc RRAppDelegate.applicationDidBecomeActive(_:) + 52 (<compiler-generated>:52) 18 UIKitCore 0x1fb048 -[UIApplication _stopDeactivatingForReason:] + 1368 My animateTransition code is: ```func animateTransition( using transitionContext: UIViewControllerContextTransitioning) { guard let (fromView, toView, fromVC, toVC) = filterTargets(context: transitionContext) else { transitionContext.cancelInteractiveTransition() transitionContext.completeTransition(false) return } let containerView = transitionContext.containerView toView.frame = transitionContext.finalFrame(for: toVC) guard let targetView = fromVC.animationTargetView, let fromFrame = fromVC.animationTargetFrame, let toFrame = toVC.animationTargetFrame else { containerView.insertSubview(toView, aboveSubview: fromView) toView.frame = transitionContext.finalFrame(for: toVC) transitionContext.completeTransition(true) return } let newFromFrame = fromView.convert(fromFrame, to: containerView) let tempImageView: UIImageView if let target = targetView as? UIImageView, let image = targetImage ?? target.image, image.size.height != 0, target.frame.height != 0, image.size.width / image.size.height != target.frame.width / target.frame.height { targetImage = image tempImageView = UIImageView(image: image) tempImageView.frame = newFromFrame tempImageView.contentMode = .scaleAspectFit } else { tempImageView = targetView.room.asImageView() tempImageView.frame = newFromFrame } targetView.isHidden = true let tempFromView = containerView.room.asImageView() targetView.isHidden = false let tempHideView = UIView() containerView.addSubview(tempFromView) containerView.insertSubview(toView, aboveSubview: tempFromView) tempHideView.backgroundColor = .white toView.addSubview(tempHideView) containerView.addSubview(tempImageView) //Minus with item detail view y position //Need to minus navigation bar height of item detail view var tempHideViewFrame = toFrame tempHideViewFrame.origin.y -= toView.frame.origin.y tempHideView.frame = tempHideViewFrame let duration = transitionDuration(using: transitionContext) toView.alpha = 0 UIView.animate(withDuration: duration * 0.5, delay: duration * 0.5, options: .curveLinear, animations: { toView.alpha = 1 }) let scale: CGFloat = toFrame.width / newFromFrame.width let newFrame = CGRect( x: toFrame.minX - newFromFrame.minX * scale, y: toFrame.minY - newFromFrame.minY * scale, width: tempFromView.frame.size.width * scale, height: tempFromView.frame.size.height * scale) UIView.animate(withDuration: duration, delay: 0.0, options: [.curveEaseInOut], animations: { tempFromView.frame = newFrame tempImageView.frame = toFrame }, completion: { _ in tempHideView.removeFromSuperview() tempFromView.removeFromSuperview() tempImageView.removeFromSuperview() transitionContext.completeTransition(!transitionContext.transitionWasCancelled) }) }
4
0
240
Apr ’25
VideoToolbox crash in macOS
My Mac app crashes for some users inside VideoToolbox, and I'm not sure what to do with that, and how to fix it. Here are couple of examples that repeating again and again for macOS 15.* Thread 10 Crashed: 0 libsystem_pthread.dylib 0x000000018535a8e0 0x185359000 + 6368 1 VideoToolbox 0x0000000194f3e218 0x194f28000 + 90648 2 VideoToolbox 0x00000001951de384 0x194f28000 + 2843524 3 libxpc.dylib 0x000000018506f2c0 0x185060000 + 62144 4 libxpc.dylib 0x000000018506da14 0x185060000 + 55828 5 libdispatch.dylib 0x00000001851ad674 0x1851a9000 + 18036 6 libdispatch.dylib 0x00000001851c9c88 0x1851a9000 + 134280 7 libdispatch.dylib 0x00000001851b4a38 0x1851a9000 + 47672 8 libdispatch.dylib 0x00000001851ca9dc 0x1851a9000 + 137692 9 libdispatch.dylib 0x00000001851b4a38 0x1851a9000 + 47672 10 libdispatch.dylib 0x00000001851b5764 0x1851a9000 + 51044 11 libdispatch.dylib 0x00000001851bf4cc 0x1851a9000 + 91340 12 libdispatch.dylib 0x00000001851bf260 0x1851a9000 + 90720 13 libsystem_pthread.dylib 0x00000001853602e4 0x185359000 + 29412 14 libsystem_pthread.dylib 0x000000018535b0fc 0x185359000 + 8444 and Thread 10 Crashed: 0 libsystem_pthread.dylib 0x00000001981fc364 0x1981fb000 + 4964 1 VideoToolbox 0x00000001a85f9964 0x1a81e8000 + 4266340 2 VideoToolbox 0x00000001a847a840 0x1a81e8000 + 2697280 3 libxpc.dylib 0x0000000197f09830 0x197efb000 + 59440 4 libxpc.dylib 0x0000000197f0812c 0x197efb000 + 53548 5 libdispatch.dylib 0x00000001980638a4 0x198048000 + 112804 6 libdispatch.dylib 0x00000001980660e8 0x198048000 + 123112 7 libdispatch.dylib 0x00000001980521b8 0x198048000 + 41400 8 libdispatch.dylib 0x0000000198066e4c 0x198048000 + 126540 9 libdispatch.dylib 0x00000001980521b8 0x198048000 + 41400 10 libdispatch.dylib 0x0000000198052e60 0x198048000 + 44640 11 libdispatch.dylib 0x000000019805be30 0x198048000 + 81456 12 libdispatch.dylib 0x000000019805bbf0 0x198048000 + 80880 13 libsystem_pthread.dylib 0x0000000198201c0c 0x1981fb000 + 27660 14 libsystem_pthread.dylib 0x00000001981fcb80 0x1981fb000 + 7040 and this one is for macOS 14 Thread 10 Crashed: 0 VideoToolbox 0x000000018f12ac90 0x18f11d000 + 56464 1 VideoToolbox 0x000000018f130a80 0x18f11d000 + 80512 2 VideoToolbox 0x000000018f131090 0x18f11d000 + 82064 3 VideoToolbox 0x000000018f130f94 0x18f11d000 + 81812 4 Remote for Mac 0x00000001048d521c 0x1048d0000 + 21020 5 Foundation 0x000000018174796c 0x181709000 + 256364 6 Foundation 0x000000018174782c 0x181709000 + 256044 7 Foundation 0x00000001817477bc 0x181709000 + 255932 8 Foundation 0x0000000181746b64 0x181709000 + 252772 9 Foundation 0x00000001817468d4 0x181709000 + 252116 10 Foundation 0x00000001817467c4 0x181709000 + 251844 11 libdispatch.dylib 0x00000001803b0470 0x18039d000 + 78960 12 libdispatch.dylib 0x00000001803a13e8 0x18039d000 + 17384 13 libdispatch.dylib 0x00000001803a48ec 0x18039d000 + 30956 14 libdispatch.dylib 0x00000001803a3f08 0x18039d000 + 28424 15 libdispatch.dylib 0x00000001803b2ea8 0x18039d000 + 89768 16 libdispatch.dylib 0x00000001803b36b8 0x18039d000 + 91832 17 libsystem_pthread.dylib 0x000000018054dfd0 0x18054b000 + 12240 18 libsystem_pthread.dylib 0x000000018054cd28 0x18054b000 + 7464
0
0
165
Apr ’25
Custom, Markdown autocapitalizationType.
Hi, I've got an app that displays markdown in UITextView / NSTextView. I would like it to behave like Notes app does, that is if user types the line start modifier, e.g: "# " or "> " I would like the keyboard to show a capitalized letters. I've tried looking into overriding insertText - and it breaks the predictive text (can not insert white space). I've tried implementing UITextInputTokenizer but no luck either. Like I said, I see the Notes app does it perfectly, so maybe I'm missing something obvious or there is a way to do it without interrupting the auto-correction and predictive text. Ideally same thing can be applied to the NSTextView as the app support both platforms.
Topic: UI Frameworks SubTopic: UIKit Tags:
0
0
211
May ’25
Launch App with Siri on a locked device
We are looking at the possibility of launching our app through Siri with a locked device. We have the device responding to our App Intent but it is asking to be unlocked first. If the device is locked the intent works perfectly. It just doesn't seem to respect the set intentAuthenticationPolicy. Thank you for you time looking into this. We have set these var to .alwaysAllowed and open to true. static var authenticationPolicy: IntentAuthenticationPolicy = .alwaysAllowed static var openAppWhenRun: Bool = true Here is our full test code: import AppIntents import SwiftUI // MARK: - App Intents struct OpenAppIntent: AppIntent { static var title: LocalizedStringResource = "Open Main App" static var description: IntentDescription? = .init(stringLiteral: "Opens the App") static var authenticationPolicy: IntentAuthenticationPolicy = .alwaysAllowed static var openAppWhenRun: Bool = true func perform() async throws -> some IntentResult { print("App opened") return .result() } } struct TestAppShortcutProvider: AppShortcutsProvider { static var appShortcuts: [AppShortcut] { AppShortcut( intent: OpenAppIntent(), phrases: [ "Begin \(.applicationName)" ], shortTitle: "Open App", systemImageName: "popcorn.fill" ) } }
1
0
125
Apr ’25
CollectionViewCell switch back to single column once UImage is assigned
Hi I am building a simple multi column CollectionView here and trying to add 3 cell in a row. Well, in short the column and rows looks all fine if I comment the below code. which is no image and text assigned to cells. let framework = list[indexPath.item] cell.configure(framework) However, once uncommented, only a single cell is displayed per row and the image doesn't seem to be resizing automatically. Can you please advise. Below is the ViewController. import UIKit class FrameworkListViewController: UIViewController { @IBOutlet weak var collectionView: UICollectionView! let list: [AppleFramework] = AppleFramework.list override func viewDidLoad() { super.viewDidLoad() collectionView.dataSource = self collectionView.delegate = self } } extension FrameworkListViewController: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return list.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FrameworkCell", for: indexPath) as? FrameworkCell else { return UICollectionViewCell() } let framework = list[indexPath.item] cell.configure(framework) return cell } } extension FrameworkListViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let interItemSpacing: CGFloat = 10 let width = (collectionView.bounds.width - interItemSpacing * 2) / 3 let height = width * 1.5 return CGSize(width: width, height: height) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return 10 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return 10 } } This is Cell class FrameworkCell: UICollectionViewCell { @IBOutlet weak var thumbnailImageView: UIImageView! @IBOutlet weak var nameLabel: UILabel! func configure(_ framework: AppleFramework) { thumbnailImageView.image = UIImage(named: framework.imageName) nameLabel.text = framework.name } }
Topic: UI Frameworks SubTopic: UIKit
1
0
56
May ’25
UIPasteControl Not Recognizing Tap
I have an iOS app where I'm trying to paste something previously copied to the user's UIPasteboard. I came across the UIPasteControl as an option for a user to tap to silently paste without having the prompt "Allow Paste" pop up. For some reason, despite having what seemingly is the correct configurations for the UIPasteControl, on testing a tap, nothing is called. I expected override func paste(itemProviders: [NSItemProvider]) to fire, but it does not. Any help would be appreciated as there doesn't seem to be much info anywhere regarding UIPasteControl. import UniformTypeIdentifiers class ViewController: UIViewController { private let pasteControl = UIPasteControl() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground pasteControl.target = self pasteConfiguration = UIPasteConfiguration(acceptableTypeIdentifiers: [ UTType.text.identifier, UTType.url.identifier, UTType.plainText.identifier ]) view.addSubview(pasteControl) pasteControl.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ pasteControl.centerXAnchor.constraint(equalTo: view.centerXAnchor), pasteControl.centerYAnchor.constraint(equalTo: view.centerYAnchor), ]) } } extension ViewController { override func paste(itemProviders: [NSItemProvider]) { for provider in itemProviders { if provider.hasItemConformingToTypeIdentifier(UTType.url.identifier) { provider.loadObject(ofClass: URL.self) { [weak self] reading, _ in guard let url = reading as? URL else { return } print(url) } } else if provider.hasItemConformingToTypeIdentifier(UTType.plainText.identifier) { provider.loadObject(ofClass: NSString.self) { [weak self] reading, _ in guard let nsstr = reading as? NSString else { return } let str = nsstr as String if let url = URL(string: str) { print(url) } } } } } }
2
0
125
Apr ’25
Debugging Snapshot Thread Confinement Warning in UITableViewDiffableDataSource
I first applied a snapshot on the main thread like this: var snapshot = NSDiffableDataSourceSnapshot<Section, MessageViewModel>() snapshot.appendSections([.main]) snapshot.appendItems([], toSection: .main) dataSource.applySnapshotUsingReloadData(snapshot) After loading data, I applied the snapshot again using: Task { @MainActor in await dataSource.applySnapshotUsingReloadData(snapshot) } On an iPhone 13 mini, I received the following warning: Warning: applying updates in a non-thread confined manner is dangerous and can lead to deadlocks. Please always submit updates either always on the main queue or always off the main queue However, this warning did not appear when I ran the same code on an iPhone 16 Pro simulator. Can anyone explain it to me? Thank you
Topic: UI Frameworks SubTopic: UIKit Tags:
0
0
109
May ’25
Arabic Text Appears Reversed and Broken in SwiftUI Lists, TextFields, and Pickers
Hello, I would like to report a critical issue with Arabic text rendering in SwiftUI apps on iOS and iPadOS. When using Arabic as the default language (Right-to-Left - RTL), Arabic text appears reversed and disconnected inside several SwiftUI components like: List Section TextField Picker Custom views (like StudentRowView) Even though the environment is set to .layoutDirection(.rightToLeft), the dynamic Arabic text is not rendered properly. Static headers display correctly, but any dynamic content (student names, notes, field titles) becomes broken and unreadable. Examples where the issue occurs: AboutView.swift → Arabic text inside List and Section SettingsView.swift → TextField placeholders and Picker options StudentRowView.swift → Student names and grade field titles Environment: SwiftUI 5 (Xcode 15+) iOS 17+ Reproducible 100% on both Simulator and real devices. Expected Behavior: Arabic text should appear properly connected, right-aligned, and readable without any manual workaround for each Text or TextField. Workarounds Tried: Manually setting .multilineTextAlignment(.trailing) (inefficient) Wrapping every Text inside an HStack with Spacer (hacky) Building custom UIKit views (defeats purpose of SwiftUI simplicity) Formal Feedback: I have submitted a Feedback Assistant report We hope this issue will be prioritized and fixed to improve SwiftUI's support for Arabic and other RTL languages. Thank you.
1
0
167
Apr ’25
Confused about the appclip.apple.com domain
Question: I'm aware of the AASA file hosting procedure to make app clips work and link them to your website, but IIRC you can trigger app clips via the simple appclip.apple.com URL too, right? As a result no need to host the AASA file. Like my app store connect gave me the URL https://appclip.apple.com/id?p=myname.myappsname.Clip but when I click it it says "This app clip is not currently available in your country or region". However I'm also getting Bad JSON content on the View Status under the domain. I'm so confused.
1
0
145
Apr ’25
Scene.windowIdealSize(.fitToContent) seems not working
Hi everyone, Something didn't work in my environment so I wrote some demo code: import SwiftUI @main struct DemoApp: App { var body: some Scene { WindowGroup { Color.accentColor.opacity(1/4) .frame(idealWidth: 800, idealHeight: 800) } .windowIdealSize(.fitToContent) } } I expected a 800*800 window (then +28pt top) using .windowIdealSize(.fitToContent). Otherwise I can't control these views that use up available space such as Color, Spacer, GeometryReader, etc. Was I missing something? Or this is a problem or intended framework design? Environments: macOS 15.4.1 (24E263) and 15.5 beta 4 (24F5068b) Xcode 16.3 (16E140)
2
0
145
May ’25
Custom Trait with UITraitBridgedEnvironmentKey not writing back to UITraitCollection
Hello, In my SwiftUI App i'm trying to create a custom UI trait and a matching bridged SwiftUI environment key. I want to override the environment key in a swift view and then have that reflect in the current UITraitCollection. I'm following the pattern in the linked video but am not seeing the changes reflect in the current trait collection when I update the swift env value. I can't find anything online that is helping. Does anyone know what I am missing? https://developer.apple.com/videos/play/wwdc2023/10057/ // Setup enum CustomTheme: String, Codable { case theme1 = “theme1”, theme2 = “theme2” } struct customThemeTrait: UITraitDefinition { static let defaultValue = brand.theme1 static let affectsColorAppearance = true static let identifier = "com.appName.customTheme" } extension UITraitCollection { var customTheme: CustomTheme { self[customThemeTrait.self] } } extension UIMutableTraits { var customTheme: CustomTheme { get { self[customThemeTrait.self] } set { self[customThemeTrait.self] = newValue } } } private struct customThemeKey: EnvironmentKey { static let defaultValue: CustomTheme = .theme1 } extension customThemeKey: UITraitBridgedEnvironmentKey { static func read(from traitCollection: UITraitCollection) -> CustomTheme { traitCollection.customTheme } static func write(to mutableTraits: inout UIMutableTraits, value: CustomTheme) { mutableTraits.customTheme = value } } extension EnvironmentValues { var customTheme: CustomTheme { get { self[customThemeKey.self] } set { self[customThemeKey.self] = newValue } } } // Attempted Usage extension Color { static func primaryBackground() -> Color { UITraitCollection.current.customTheme == .theme1 ? Color.red : Color.blue } } struct ContentView: View { @State private var theme = .theme1 var body: some View { if (dataHasLoaded && themeIsSet) { HomeView() .environment(\.customTheme, theme) } else { SelectThemeView( theme: self.theme, setContentThemeHandler) } } func setContentThemeHandler(theme: customTheme) { self.theme = theme } } struct HomeView() { @Environment(\.customTheme) private var currentTheme: customTheme var body: some View { VStack { Text("currentTheme: \(currentTheme.rawValue)") .background(Color.primaryBackground()) Text("currentUITrait: \(UITraitCollection.current.customTheme.rawValue)") .background(Color.primaryBackground()) } } } OUTCOME: After selecting theme2 in the theme selector view and navigating to the homeView, the background is still red and the env and trait values print the following: currentTheme: theme2 currentUITrait: theme1 Can anyone help me identify what I am missing?
1
0
99
Apr ’25
-applicationDockMenu: method on NSApplicationDelegate doesn't work when attached to debugger
When I add a simple menu to the dock via the NSApplicationDelegate method -applicationDockMenu: and run the app from Xcode it doesn't work. -(NSMenu*)applicationDockMenu:(NSApplication*)sender { NSMenu *dockMenu = [self buildDockMenu]; if (dockMenu != nil) { NSLog(@"Returning dock menu."); return dockMenu; } else { NSLog(@"Not ready to build dock menu"); return nil; } } When I run the app, my main app window shows up but nothing logs out in -applicationDockMenu: until I click outside my app's window (so if I click the desktop background, or a Finder window, or whatever). Then after I click outside my app's main window this logs out: Returning dock menu. The "Not ready to build dock menu" message does not log out. But...when I right click on the dock icon, the menu doesn't show up. But if I stop the app from Xcode and just run it not attached to the debugger, the dock menu does show up. But this makes the debugging/testing situation not ideal.
3
0
180
May ’25
Remove "copy cursor" when dragging a view in SwiftUI
Hi, Im new to SwiftUI and Im trying to implement some drag and drop functionality for some tabs in my application. Im using .draggable(_) and .dropDestination for this and the issue I have is that as I drag the view, the mouse cursor changes to the copy cursor with the green plus sign and I don't like it but I can't figure out how to avoid it. Any help would be appreciated.
1
0
78
Apr ’25
UICollectionView Dequeue Crash Xcode 16.2
I am facing same issue with major crash while coming out from this function. Basically using collectionView.dequeReusableCell with size calculation. func getSizeOfFavouriteCell(_ collectionView: UICollectionView, at indexPath: IndexPath, item: FindCircleInfoCellItem) -> CGSize { guard let dummyCell = collectionView.dequeueReusableCell( withReuseIdentifier: TAButtonAddCollectionViewCell.reuseIdentifier, for: indexPath) as? TAButtonAddCollectionViewCell else { return CGSize.zero } dummyCell.title = item.title dummyCell.subtitle = item.subtitle dummyCell.icon = item.icon dummyCell.layoutIfNeeded() var targetSize = CGSize.zero if viewModel.favoritesDataSource.isEmpty.not, viewModel.favoritesDataSource.count > FindSheetViewControllerConstants.minimumFavoritesToDisplayInSection { targetSize = CGSize(width: collectionView.frame.size.width / 2, height: collectionView.frame.height) var estimatedSize: CGSize = dummyCell.systemLayoutSizeFitting(targetSize) if estimatedSize.width > targetSize.width { estimatedSize.width = targetSize.width } return CGSize(width: estimatedSize.width, height: targetSize.height) } } We have resolve issue with size calculation with checking nil. Working fine in xcode 15 and 16+. Note: Please help me with reason of crash? Is it because of xCode 16.2 onwards **strict check on UICollectionView **
Replies
0
Boosts
0
Views
155
Activity
Apr ’25
UIInputView not being deallocated
I am experiencing memory leaks in my iOS app that seem to be related to an issue between UIInputView and _UIInputViewContent. After using the memory graph, I'm seeing that instances of these objects aren't being deallocated properly. The UIInputViewController whichs holds the inputView is being deallocated properly along with its subviews.I have tried to remove all of UIInputViewController's subviews and their functions but the uiInputView is not being deallocated. The current setup of my app is a collectionView with multiple cell,each possessing a textfield with holds a UIInputViewController.When i scroll up or down,the views are being reused as expected and the number of UIInputViewController stays consistent with the number of textfields.However the number of inputView keeps increasing referencing solely _UIInputViewContent. class KeyboardViewController: UIInputViewController { // Callbacks var key1: ((String) -> Void)? var key2: (() -> Void)? var key3: (() -> Void)? var key4: (() -> Void)? private lazy var buttonTitles = [ ["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"] ] override func viewDidLoad() { super.viewDidLoad() setupKeyboard() } lazy var mainStackView: UIStackView = { let mainStackView = UIStackView() mainStackView.axis = .vertical mainStackView.distribution = .fillEqually mainStackView.spacing = 16 mainStackView.translatesAutoresizingMaskIntoConstraints = false return mainStackView }() private func setupKeyboard() { let keyboardView = UIView(frame:CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 279.0)) keyboardView.addSubview(mainStackView) NSLayoutConstraint.activate([ mainStackView.topAnchor.constraint(equalTo: keyboardView.topAnchor, constant: 16), mainStackView.leadingAnchor.constraint(equalTo: keyboardView.leadingAnchor, constant: 0), mainStackView.trailingAnchor.constraint(equalTo: keyboardView.trailingAnchor, constant: -24), mainStackView.bottomAnchor.constraint(equalTo: keyboardView.bottomAnchor, constant: -35) ]) // Create rows for (_, _) in buttonTitles.enumerated() { let rowStackView = UIStackView() rowStackView.axis = .horizontal rowStackView.distribution = .fillEqually rowStackView.spacing = 1 // Create buttons for each row for title in rowTitles { let button = createButton(title: title) rowStackView.addArrangedSubview(button) } mainStackView.addArrangedSubview(rowStackView) } self.view = keyboardView } private func createButton(title: String) -> UIButton { switch title { ///returns a uibutton based on title } } // MARK: - Button Actions @objc private func numberTapped(_ sender: UIButton) { if let number = sender.title(for: .normal) { key1?(number) } } @objc private func key2Called() { key2?() } @objc private func key3Called() { key3?() } @objc private func key4Called() { key4?() } deinit { // Clear any strong references key1 = nil key2 = nil key3 = nil key4 = nil for subview in mainStackView.arrangedSubviews { if let stackView = subview as? UIStackView { for button in stackView.arrangedSubviews { (button as? UIButton)?.removeTarget(self, action: nil, for: .allEvents) } } } mainStackView.removeFromSuperview() } } Environment iOS 16.3 Xcode 18.3.1 Any insights would be greatly appreciated as this is causing noticeable memory growth in my app over time.
Replies
0
Boosts
0
Views
80
Activity
Apr ’25
App Name Display
For now, my app name length is more than 20 characters, so the iPhone app name displays without a space, and uses the range operator to ensure showing the rest in the next line. Is it possible to show space and name with 2 lines?
Topic: UI Frameworks SubTopic: General Tags:
Replies
0
Boosts
0
Views
84
Activity
May ’25
Dynamic island not displaying UI views
i finally got previews for dynamic island to work and I'm just trying to first work on adding a static UI elements to my dynamic island like i did for my live screen live activity, but my dynamic island view is showing up totally empty, if i add my app icon image to the compact leading closure, it doesn't appear, if i ad text to an expanded region closure it doesn't appear. am really stuck on this and would approeciate the help. var body: some View { Image("dynamicrep") .resizable() .scaledToFit() .clipShape(.circle) } } struct DynamicRepLiveActivity: Widget { var body: some WidgetConfiguration { ActivityConfiguration(for: DynamicRepAttributes.self) { context in VStack { HStack(spacing: 257) { Text("from \(context.attributes.titleName ?? "no title")") .fontWeight(.light) .font(.system(size: 16)) .foregroundStyle(Color.gray) Circle() .frame(width: 53, height: 50) .foregroundStyle(Color.gray).opacity(0.23) .overlay { Image("mmicon") } } .frame(maxWidth: 500, maxHeight: 210) Spacer() Text("\(context.attributes.contentBody ?? "no content")") } .activityBackgroundTint(Color.cyan) .activitySystemActionForegroundColor(Color.black) .frame(width: 500, height: 300) } dynamicIsland: { context in DynamicIsland { // Expanded UI goes here. Compose the expanded UI through // various regions, like leading/trailing/center/bottom DynamicIslandExpandedRegion(.leading) { Text("from \(context.attributes.titleName ?? "no title")") } DynamicIslandExpandedRegion(.trailing) { Circle() } DynamicIslandExpandedRegion(.bottom) { Text("\(context.attributes.contentBody ?? "no content")") } } compactLeading: { AppLogo() } compactTrailing: { Text("") //empty for now } minimal: { Text("hello") //empty for now } .widgetURL(URL(string: "MuscleMemory.KimchiLabs.com")) .keylineTint(Color.white) } } }
Replies
1
Boosts
0
Views
149
Activity
Apr ’25
How to create a QuickTime recording like panel?
QuickTime recording palette behaves in a way which I want to replicate in my desktop app - specifically the behaviour when switching spaces, it appears on top. Currently, my app appears on all spaces, and even over fullscreen applications BUT it already exists when I switch to the space, this feels disjointed. I can't find a solution to this behaviour. Here's the Window Collection Behaviours I've tried (on an NSPanel): FullScreenAuxiliary - appears over fullscreen apps. CanJoinAllSpaces - appears on all spaces. These two options make the dock show up on all spaces in the same position, but on each space they already exists. I've tried this behaviour too: MoveToActiveSpace - which as per docs would move the window into active space only when its reopened, mine stays open all the time. I can't find any more information on how QuickTime achieves this.
Topic: UI Frameworks SubTopic: SwiftUI
Replies
0
Boosts
0
Views
73
Activity
May ’25
[iOS 18 Only] Intermittent Crash at completeTransition in Custom Navigation Animation (Firebase Crashlytics)
Hi everyone, I'm encountering an intermittent crash on iOS 18 only (not reproducible locally, reported in Firebase Crashlytics) at transitionContext.completeTransition(!transitionContext.transitionWasCancelled) within my custom UIViewControllerAnimatedTransitioning. The same code runs fine on iOS 16 and 17 (no Crashlytics report for those iOS version) Here's the crash log: Crashed: com.apple.main-thread 0 libswiftCore.dylib 0x4391f0 swift_getObjectType + 40 1 ROOM 0x490c48 ItemDetailAnimator.navigationController(_:animationControllerFor:from:to:) + 47 (ItemDetailAnimator.swift:47) 2 ROOM 0x490f3c @objc ItemDetailAnimator.navigationController(_:animationControllerFor:from:to:) + 92 (<compiler-generated>:92) 3 UIKitCore 0xa2d7a4 -[UINavigationController _customTransitionController:] + 516 4 UIKitCore 0x2e51dc -[UINavigationController _immediatelyApplyViewControllers:transition:animated:operation:] + 2620 5 UIKitCore 0x1541d4 __94-[UINavigationController _applyViewControllers:transition:animated:operation:rescheduleBlock:]_block_invoke + 100 6 UIKitCore 0x150768 -[UINavigationController _applyViewControllers:transition:animated:operation:rescheduleBlock:] + 776 7 UIKitCore 0x2e7e44 -[UINavigationController pushViewController:transition:forceImmediate:] + 544 8 UIKitCore 0x2e4230 -[UINavigationController pushViewController:animated:] + 444 9 ROOM 0x66cb04 UINavigationController.pushViewController(_:animated:completion:) + 185 (UINavigationController+Room.swift:185) 10 ROOM 0x8cef4c ItemDetailCoordinator.start(animated:completion:) + 99 (ItemDetailCoordinator.swift:99) 11 ROOM 0xc6c95c protocol witness for Coordinator.start(animated:completion:) in conformance BaseCoordinator + 24 (<compiler-generated>:24) 12 ROOM 0x8ca520 AppCoordinator.startCoordinator(_:url:reference:animated:completion:) + 729 (AppCoordinator.swift:729) 13 ROOM 0x8cb248 protocol witness for URLSupportCoordinatorOpener.startCoordinator(_:url:reference:animated:completion:) in conformance AppCoordinator + 48 (<compiler-generated>:48) 14 ROOM 0xd6166c URLSupportCoordinatorOpener<>.open(url:openingController:reference:animated:completion:) + 118 (URLSupportedCoordinator.swift:118) 15 ROOM 0xc56038 RRAppDelegate.handleURL(url:completion:) + 588 (RRAppDelegate.swift:588) 16 ROOM 0xc502d0 RRAppDelegate.applicationDidBecomeActive(_:) + 330 (RRAppDelegate.swift:330) 17 ROOM 0xc5041c @objc RRAppDelegate.applicationDidBecomeActive(_:) + 52 (<compiler-generated>:52) 18 UIKitCore 0x1fb048 -[UIApplication _stopDeactivatingForReason:] + 1368 My animateTransition code is: ```func animateTransition( using transitionContext: UIViewControllerContextTransitioning) { guard let (fromView, toView, fromVC, toVC) = filterTargets(context: transitionContext) else { transitionContext.cancelInteractiveTransition() transitionContext.completeTransition(false) return } let containerView = transitionContext.containerView toView.frame = transitionContext.finalFrame(for: toVC) guard let targetView = fromVC.animationTargetView, let fromFrame = fromVC.animationTargetFrame, let toFrame = toVC.animationTargetFrame else { containerView.insertSubview(toView, aboveSubview: fromView) toView.frame = transitionContext.finalFrame(for: toVC) transitionContext.completeTransition(true) return } let newFromFrame = fromView.convert(fromFrame, to: containerView) let tempImageView: UIImageView if let target = targetView as? UIImageView, let image = targetImage ?? target.image, image.size.height != 0, target.frame.height != 0, image.size.width / image.size.height != target.frame.width / target.frame.height { targetImage = image tempImageView = UIImageView(image: image) tempImageView.frame = newFromFrame tempImageView.contentMode = .scaleAspectFit } else { tempImageView = targetView.room.asImageView() tempImageView.frame = newFromFrame } targetView.isHidden = true let tempFromView = containerView.room.asImageView() targetView.isHidden = false let tempHideView = UIView() containerView.addSubview(tempFromView) containerView.insertSubview(toView, aboveSubview: tempFromView) tempHideView.backgroundColor = .white toView.addSubview(tempHideView) containerView.addSubview(tempImageView) //Minus with item detail view y position //Need to minus navigation bar height of item detail view var tempHideViewFrame = toFrame tempHideViewFrame.origin.y -= toView.frame.origin.y tempHideView.frame = tempHideViewFrame let duration = transitionDuration(using: transitionContext) toView.alpha = 0 UIView.animate(withDuration: duration * 0.5, delay: duration * 0.5, options: .curveLinear, animations: { toView.alpha = 1 }) let scale: CGFloat = toFrame.width / newFromFrame.width let newFrame = CGRect( x: toFrame.minX - newFromFrame.minX * scale, y: toFrame.minY - newFromFrame.minY * scale, width: tempFromView.frame.size.width * scale, height: tempFromView.frame.size.height * scale) UIView.animate(withDuration: duration, delay: 0.0, options: [.curveEaseInOut], animations: { tempFromView.frame = newFrame tempImageView.frame = toFrame }, completion: { _ in tempHideView.removeFromSuperview() tempFromView.removeFromSuperview() tempImageView.removeFromSuperview() transitionContext.completeTransition(!transitionContext.transitionWasCancelled) }) }
Replies
4
Boosts
0
Views
240
Activity
Apr ’25
VideoToolbox crash in macOS
My Mac app crashes for some users inside VideoToolbox, and I'm not sure what to do with that, and how to fix it. Here are couple of examples that repeating again and again for macOS 15.* Thread 10 Crashed: 0 libsystem_pthread.dylib 0x000000018535a8e0 0x185359000 + 6368 1 VideoToolbox 0x0000000194f3e218 0x194f28000 + 90648 2 VideoToolbox 0x00000001951de384 0x194f28000 + 2843524 3 libxpc.dylib 0x000000018506f2c0 0x185060000 + 62144 4 libxpc.dylib 0x000000018506da14 0x185060000 + 55828 5 libdispatch.dylib 0x00000001851ad674 0x1851a9000 + 18036 6 libdispatch.dylib 0x00000001851c9c88 0x1851a9000 + 134280 7 libdispatch.dylib 0x00000001851b4a38 0x1851a9000 + 47672 8 libdispatch.dylib 0x00000001851ca9dc 0x1851a9000 + 137692 9 libdispatch.dylib 0x00000001851b4a38 0x1851a9000 + 47672 10 libdispatch.dylib 0x00000001851b5764 0x1851a9000 + 51044 11 libdispatch.dylib 0x00000001851bf4cc 0x1851a9000 + 91340 12 libdispatch.dylib 0x00000001851bf260 0x1851a9000 + 90720 13 libsystem_pthread.dylib 0x00000001853602e4 0x185359000 + 29412 14 libsystem_pthread.dylib 0x000000018535b0fc 0x185359000 + 8444 and Thread 10 Crashed: 0 libsystem_pthread.dylib 0x00000001981fc364 0x1981fb000 + 4964 1 VideoToolbox 0x00000001a85f9964 0x1a81e8000 + 4266340 2 VideoToolbox 0x00000001a847a840 0x1a81e8000 + 2697280 3 libxpc.dylib 0x0000000197f09830 0x197efb000 + 59440 4 libxpc.dylib 0x0000000197f0812c 0x197efb000 + 53548 5 libdispatch.dylib 0x00000001980638a4 0x198048000 + 112804 6 libdispatch.dylib 0x00000001980660e8 0x198048000 + 123112 7 libdispatch.dylib 0x00000001980521b8 0x198048000 + 41400 8 libdispatch.dylib 0x0000000198066e4c 0x198048000 + 126540 9 libdispatch.dylib 0x00000001980521b8 0x198048000 + 41400 10 libdispatch.dylib 0x0000000198052e60 0x198048000 + 44640 11 libdispatch.dylib 0x000000019805be30 0x198048000 + 81456 12 libdispatch.dylib 0x000000019805bbf0 0x198048000 + 80880 13 libsystem_pthread.dylib 0x0000000198201c0c 0x1981fb000 + 27660 14 libsystem_pthread.dylib 0x00000001981fcb80 0x1981fb000 + 7040 and this one is for macOS 14 Thread 10 Crashed: 0 VideoToolbox 0x000000018f12ac90 0x18f11d000 + 56464 1 VideoToolbox 0x000000018f130a80 0x18f11d000 + 80512 2 VideoToolbox 0x000000018f131090 0x18f11d000 + 82064 3 VideoToolbox 0x000000018f130f94 0x18f11d000 + 81812 4 Remote for Mac 0x00000001048d521c 0x1048d0000 + 21020 5 Foundation 0x000000018174796c 0x181709000 + 256364 6 Foundation 0x000000018174782c 0x181709000 + 256044 7 Foundation 0x00000001817477bc 0x181709000 + 255932 8 Foundation 0x0000000181746b64 0x181709000 + 252772 9 Foundation 0x00000001817468d4 0x181709000 + 252116 10 Foundation 0x00000001817467c4 0x181709000 + 251844 11 libdispatch.dylib 0x00000001803b0470 0x18039d000 + 78960 12 libdispatch.dylib 0x00000001803a13e8 0x18039d000 + 17384 13 libdispatch.dylib 0x00000001803a48ec 0x18039d000 + 30956 14 libdispatch.dylib 0x00000001803a3f08 0x18039d000 + 28424 15 libdispatch.dylib 0x00000001803b2ea8 0x18039d000 + 89768 16 libdispatch.dylib 0x00000001803b36b8 0x18039d000 + 91832 17 libsystem_pthread.dylib 0x000000018054dfd0 0x18054b000 + 12240 18 libsystem_pthread.dylib 0x000000018054cd28 0x18054b000 + 7464
Replies
0
Boosts
0
Views
165
Activity
Apr ’25
Custom, Markdown autocapitalizationType.
Hi, I've got an app that displays markdown in UITextView / NSTextView. I would like it to behave like Notes app does, that is if user types the line start modifier, e.g: "# " or "> " I would like the keyboard to show a capitalized letters. I've tried looking into overriding insertText - and it breaks the predictive text (can not insert white space). I've tried implementing UITextInputTokenizer but no luck either. Like I said, I see the Notes app does it perfectly, so maybe I'm missing something obvious or there is a way to do it without interrupting the auto-correction and predictive text. Ideally same thing can be applied to the NSTextView as the app support both platforms.
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
0
Boosts
0
Views
211
Activity
May ’25
Launch App with Siri on a locked device
We are looking at the possibility of launching our app through Siri with a locked device. We have the device responding to our App Intent but it is asking to be unlocked first. If the device is locked the intent works perfectly. It just doesn't seem to respect the set intentAuthenticationPolicy. Thank you for you time looking into this. We have set these var to .alwaysAllowed and open to true. static var authenticationPolicy: IntentAuthenticationPolicy = .alwaysAllowed static var openAppWhenRun: Bool = true Here is our full test code: import AppIntents import SwiftUI // MARK: - App Intents struct OpenAppIntent: AppIntent { static var title: LocalizedStringResource = "Open Main App" static var description: IntentDescription? = .init(stringLiteral: "Opens the App") static var authenticationPolicy: IntentAuthenticationPolicy = .alwaysAllowed static var openAppWhenRun: Bool = true func perform() async throws -> some IntentResult { print("App opened") return .result() } } struct TestAppShortcutProvider: AppShortcutsProvider { static var appShortcuts: [AppShortcut] { AppShortcut( intent: OpenAppIntent(), phrases: [ "Begin \(.applicationName)" ], shortTitle: "Open App", systemImageName: "popcorn.fill" ) } }
Replies
1
Boosts
0
Views
125
Activity
Apr ’25
CollectionViewCell switch back to single column once UImage is assigned
Hi I am building a simple multi column CollectionView here and trying to add 3 cell in a row. Well, in short the column and rows looks all fine if I comment the below code. which is no image and text assigned to cells. let framework = list[indexPath.item] cell.configure(framework) However, once uncommented, only a single cell is displayed per row and the image doesn't seem to be resizing automatically. Can you please advise. Below is the ViewController. import UIKit class FrameworkListViewController: UIViewController { @IBOutlet weak var collectionView: UICollectionView! let list: [AppleFramework] = AppleFramework.list override func viewDidLoad() { super.viewDidLoad() collectionView.dataSource = self collectionView.delegate = self } } extension FrameworkListViewController: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return list.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FrameworkCell", for: indexPath) as? FrameworkCell else { return UICollectionViewCell() } let framework = list[indexPath.item] cell.configure(framework) return cell } } extension FrameworkListViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let interItemSpacing: CGFloat = 10 let width = (collectionView.bounds.width - interItemSpacing * 2) / 3 let height = width * 1.5 return CGSize(width: width, height: height) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return 10 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return 10 } } This is Cell class FrameworkCell: UICollectionViewCell { @IBOutlet weak var thumbnailImageView: UIImageView! @IBOutlet weak var nameLabel: UILabel! func configure(_ framework: AppleFramework) { thumbnailImageView.image = UIImage(named: framework.imageName) nameLabel.text = framework.name } }
Topic: UI Frameworks SubTopic: UIKit
Replies
1
Boosts
0
Views
56
Activity
May ’25
UIPasteControl Not Recognizing Tap
I have an iOS app where I'm trying to paste something previously copied to the user's UIPasteboard. I came across the UIPasteControl as an option for a user to tap to silently paste without having the prompt "Allow Paste" pop up. For some reason, despite having what seemingly is the correct configurations for the UIPasteControl, on testing a tap, nothing is called. I expected override func paste(itemProviders: [NSItemProvider]) to fire, but it does not. Any help would be appreciated as there doesn't seem to be much info anywhere regarding UIPasteControl. import UniformTypeIdentifiers class ViewController: UIViewController { private let pasteControl = UIPasteControl() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground pasteControl.target = self pasteConfiguration = UIPasteConfiguration(acceptableTypeIdentifiers: [ UTType.text.identifier, UTType.url.identifier, UTType.plainText.identifier ]) view.addSubview(pasteControl) pasteControl.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ pasteControl.centerXAnchor.constraint(equalTo: view.centerXAnchor), pasteControl.centerYAnchor.constraint(equalTo: view.centerYAnchor), ]) } } extension ViewController { override func paste(itemProviders: [NSItemProvider]) { for provider in itemProviders { if provider.hasItemConformingToTypeIdentifier(UTType.url.identifier) { provider.loadObject(ofClass: URL.self) { [weak self] reading, _ in guard let url = reading as? URL else { return } print(url) } } else if provider.hasItemConformingToTypeIdentifier(UTType.plainText.identifier) { provider.loadObject(ofClass: NSString.self) { [weak self] reading, _ in guard let nsstr = reading as? NSString else { return } let str = nsstr as String if let url = URL(string: str) { print(url) } } } } } }
Replies
2
Boosts
0
Views
125
Activity
Apr ’25
Debugging Snapshot Thread Confinement Warning in UITableViewDiffableDataSource
I first applied a snapshot on the main thread like this: var snapshot = NSDiffableDataSourceSnapshot<Section, MessageViewModel>() snapshot.appendSections([.main]) snapshot.appendItems([], toSection: .main) dataSource.applySnapshotUsingReloadData(snapshot) After loading data, I applied the snapshot again using: Task { @MainActor in await dataSource.applySnapshotUsingReloadData(snapshot) } On an iPhone 13 mini, I received the following warning: Warning: applying updates in a non-thread confined manner is dangerous and can lead to deadlocks. Please always submit updates either always on the main queue or always off the main queue However, this warning did not appear when I ran the same code on an iPhone 16 Pro simulator. Can anyone explain it to me? Thank you
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
0
Boosts
0
Views
109
Activity
May ’25
Arabic Text Appears Reversed and Broken in SwiftUI Lists, TextFields, and Pickers
Hello, I would like to report a critical issue with Arabic text rendering in SwiftUI apps on iOS and iPadOS. When using Arabic as the default language (Right-to-Left - RTL), Arabic text appears reversed and disconnected inside several SwiftUI components like: List Section TextField Picker Custom views (like StudentRowView) Even though the environment is set to .layoutDirection(.rightToLeft), the dynamic Arabic text is not rendered properly. Static headers display correctly, but any dynamic content (student names, notes, field titles) becomes broken and unreadable. Examples where the issue occurs: AboutView.swift → Arabic text inside List and Section SettingsView.swift → TextField placeholders and Picker options StudentRowView.swift → Student names and grade field titles Environment: SwiftUI 5 (Xcode 15+) iOS 17+ Reproducible 100% on both Simulator and real devices. Expected Behavior: Arabic text should appear properly connected, right-aligned, and readable without any manual workaround for each Text or TextField. Workarounds Tried: Manually setting .multilineTextAlignment(.trailing) (inefficient) Wrapping every Text inside an HStack with Spacer (hacky) Building custom UIKit views (defeats purpose of SwiftUI simplicity) Formal Feedback: I have submitted a Feedback Assistant report We hope this issue will be prioritized and fixed to improve SwiftUI's support for Arabic and other RTL languages. Thank you.
Replies
1
Boosts
0
Views
167
Activity
Apr ’25
Programmatically Setting Constraints for CollectionViewCell Elements
Is there any possibility to update constraints for elements inside CollectionViewCell with button tap? And where to put the code inside CellForItem or Inside CollectionViewCell Class File?
Replies
2
Boosts
0
Views
92
Activity
May ’25
Confused about the appclip.apple.com domain
Question: I'm aware of the AASA file hosting procedure to make app clips work and link them to your website, but IIRC you can trigger app clips via the simple appclip.apple.com URL too, right? As a result no need to host the AASA file. Like my app store connect gave me the URL https://appclip.apple.com/id?p=myname.myappsname.Clip but when I click it it says "This app clip is not currently available in your country or region". However I'm also getting Bad JSON content on the View Status under the domain. I'm so confused.
Replies
1
Boosts
0
Views
145
Activity
Apr ’25
Scene.windowIdealSize(.fitToContent) seems not working
Hi everyone, Something didn't work in my environment so I wrote some demo code: import SwiftUI @main struct DemoApp: App { var body: some Scene { WindowGroup { Color.accentColor.opacity(1/4) .frame(idealWidth: 800, idealHeight: 800) } .windowIdealSize(.fitToContent) } } I expected a 800*800 window (then +28pt top) using .windowIdealSize(.fitToContent). Otherwise I can't control these views that use up available space such as Color, Spacer, GeometryReader, etc. Was I missing something? Or this is a problem or intended framework design? Environments: macOS 15.4.1 (24E263) and 15.5 beta 4 (24F5068b) Xcode 16.3 (16E140)
Replies
2
Boosts
0
Views
145
Activity
May ’25
Custom Trait with UITraitBridgedEnvironmentKey not writing back to UITraitCollection
Hello, In my SwiftUI App i'm trying to create a custom UI trait and a matching bridged SwiftUI environment key. I want to override the environment key in a swift view and then have that reflect in the current UITraitCollection. I'm following the pattern in the linked video but am not seeing the changes reflect in the current trait collection when I update the swift env value. I can't find anything online that is helping. Does anyone know what I am missing? https://developer.apple.com/videos/play/wwdc2023/10057/ // Setup enum CustomTheme: String, Codable { case theme1 = “theme1”, theme2 = “theme2” } struct customThemeTrait: UITraitDefinition { static let defaultValue = brand.theme1 static let affectsColorAppearance = true static let identifier = "com.appName.customTheme" } extension UITraitCollection { var customTheme: CustomTheme { self[customThemeTrait.self] } } extension UIMutableTraits { var customTheme: CustomTheme { get { self[customThemeTrait.self] } set { self[customThemeTrait.self] = newValue } } } private struct customThemeKey: EnvironmentKey { static let defaultValue: CustomTheme = .theme1 } extension customThemeKey: UITraitBridgedEnvironmentKey { static func read(from traitCollection: UITraitCollection) -> CustomTheme { traitCollection.customTheme } static func write(to mutableTraits: inout UIMutableTraits, value: CustomTheme) { mutableTraits.customTheme = value } } extension EnvironmentValues { var customTheme: CustomTheme { get { self[customThemeKey.self] } set { self[customThemeKey.self] = newValue } } } // Attempted Usage extension Color { static func primaryBackground() -> Color { UITraitCollection.current.customTheme == .theme1 ? Color.red : Color.blue } } struct ContentView: View { @State private var theme = .theme1 var body: some View { if (dataHasLoaded && themeIsSet) { HomeView() .environment(\.customTheme, theme) } else { SelectThemeView( theme: self.theme, setContentThemeHandler) } } func setContentThemeHandler(theme: customTheme) { self.theme = theme } } struct HomeView() { @Environment(\.customTheme) private var currentTheme: customTheme var body: some View { VStack { Text("currentTheme: \(currentTheme.rawValue)") .background(Color.primaryBackground()) Text("currentUITrait: \(UITraitCollection.current.customTheme.rawValue)") .background(Color.primaryBackground()) } } } OUTCOME: After selecting theme2 in the theme selector view and navigating to the homeView, the background is still red and the env and trait values print the following: currentTheme: theme2 currentUITrait: theme1 Can anyone help me identify what I am missing?
Replies
1
Boosts
0
Views
99
Activity
Apr ’25
-applicationDockMenu: method on NSApplicationDelegate doesn't work when attached to debugger
When I add a simple menu to the dock via the NSApplicationDelegate method -applicationDockMenu: and run the app from Xcode it doesn't work. -(NSMenu*)applicationDockMenu:(NSApplication*)sender { NSMenu *dockMenu = [self buildDockMenu]; if (dockMenu != nil) { NSLog(@"Returning dock menu."); return dockMenu; } else { NSLog(@"Not ready to build dock menu"); return nil; } } When I run the app, my main app window shows up but nothing logs out in -applicationDockMenu: until I click outside my app's window (so if I click the desktop background, or a Finder window, or whatever). Then after I click outside my app's main window this logs out: Returning dock menu. The "Not ready to build dock menu" message does not log out. But...when I right click on the dock icon, the menu doesn't show up. But if I stop the app from Xcode and just run it not attached to the debugger, the dock menu does show up. But this makes the debugging/testing situation not ideal.
Replies
3
Boosts
0
Views
180
Activity
May ’25
Remove "copy cursor" when dragging a view in SwiftUI
Hi, Im new to SwiftUI and Im trying to implement some drag and drop functionality for some tabs in my application. Im using .draggable(_) and .dropDestination for this and the issue I have is that as I drag the view, the mouse cursor changes to the copy cursor with the green plus sign and I don't like it but I can't figure out how to avoid it. Any help would be appreciated.
Replies
1
Boosts
0
Views
78
Activity
Apr ’25
Add Caching in AsyncImage
Hi can you add caching to AsyncImage in the next swift revision pls see image below. without caching support it will redownload everything. wasting api calls
Replies
1
Boosts
0
Views
73
Activity
Apr ’25