Explore the art and science of app design. Discuss user interface (UI) design principles, user experience (UX) best practices, and share design resources and inspiration.

All subtopics
Posts under Design topic

Post

Replies

Boosts

Views

Activity

Make default Standby clock
Is there any way to lock the clock in Standby so it doesn't change? It is so frustrating when I put the phone on the charger and have to scroll back and forth, trying to find the clock I would like to use all the time.
Topic: Design SubTopic: General
1
0
590
Feb ’25
Core database relationship are only partially updating.
I created a data structure based on a dictionary of words. The purpose is to link each word to all other words made up of the same letters plus one. Example: table -> ablate, cablet, tabled, gablet, albeit, albite, etc. For this I built a data model made of three entities: Word, Draw, Link. A Draw is a set of letters corresponding to a Word and sorted in alphabetic order, like : HOUSE -> EHOSU. A Link is a letter that you add to a Draw to get another Draw. So my data model looks like this: And here is how I implemented it in Xcode: Entity Word (let's forget the attribute optComp that plays no role here) Entity Draw Entity Link I am populating the data in two steps: first I read a list of words from a .txt source and I populate the Word entity and at the same time the Draw entity with the corresponding relationship (function loadDic()) This first step apparently works fine. I can easily find all anagrams of any word with something like word.sort.word.spelling I read through the Draw entity. For each draw I seek all existing +1 draws considering each letter of the alphabet. If there are, I create a Link and add the relationships (function createLinks()) Here is where something goes wrong. If the Link's and the relationship Draw.plus seem to be correctly created, the other relationship Link.gives is only partially populated, say 50%. Moreover, I tried to apply an additional routine (updateLinks()) , focusing only on Link's with an empty Link.gives relationship and updating them. But again, only 50% of the nil relationships appear to be populated. I could not find out why those relationships are not properly populated. If someone can help me out I would be grateful. Here is the code: LoadDic() function (OK) : func loadDic() { print("Loading dictionary...") dataAlreadyLoaded.toggle() guard let url = Bundle.main.url(forResource: INPUT_FILE, withExtension: "txt") else { fatalError("\(INPUT_FILE).txt not found") } if let dico = try? String(contentsOf: url, encoding: String.Encoding.utf8 ) { let lines = dico.split(separator: "\r\n") for line in lines { let lineArray = line.split(separator: " ") print("\(lineArray[0])") // word let wordSorted = String(lineArray[0].sorted()) let draw = getDraw(drawLetters: wordSorted) ?? addDraw(drawLetters: wordSorted) // look if draw already exists, otherwise create new one. let wordItem = Word(context: viewContext) // create word entry with to-one-relationship to draw wordItem.spelling = String(lineArray[0]) wordItem.optComp = (Int(String(lineArray[1])) == 1) wordItem.sort = draw do { try viewContext.save() } catch { print("Errort saving ods9: \(error)") } } } print("Ods Chargé") } func addDraw(drawLetters: String) -> Draw { let newDraw = Draw(context: viewContext) newDraw.draw = drawLetters return(newDraw) } func getDraw(drawLetters: String) -> Draw? { let request: NSFetchRequest<Draw> = Draw.fetchRequest() request.entity = Draw.entity() request.predicate = NSPredicate(format: "draw == %@", drawLetters) do { let drw = try viewContext.fetch(request) return drw.isEmpty ? nil : drw[0] } catch { print("Erreur recherche Tirage") return nil } } createLinks() function (NOK): func createLinks() { var erreur = " fetch request <Draw>" let request: NSFetchRequest<Draw> = Draw.fetchRequest() request.entity = Draw.entity() request.predicate = NSPredicate(value: true) print("Building relationships...") do { let draws = try viewContext.fetch(request) count = draws.count for draw in draws { print("\(count) - \(draw.draw!)") linkTable.removeAll() for letter in ALPHABET { print(letter) let drawLettersPlus = String((draw.draw! + String(letter)).sorted()) // draw with one more letter if let drawPlus = draws.first(where: { $0.draw == drawLettersPlus }) { // look for Draw entity that matches augmented draw let linkItem = Link(context: viewContext) // if found, create new link based on letter with relationship to augmented draw linkItem.letter = String(letter) linkItem.gives = drawPlus erreur = " saving \(draw.draw!) + \(letter)" try viewContext.save() linkTable.append(linkItem) // saves link to populate the one-to-many relationship of the initial draw, once the alphabet is through } } let drawUpdate = draw as NSManagedObject // populate the one-to-many relationship of the initial draw let linkSet = Set(linkTable) as NSSet drawUpdate.setValue(linkSet, forKey: "plus") erreur = " saving \(draw.draw!) links plus" try viewContext.save() count -= 1 // next draw } } catch { print("Error " + erreur) } print("Graph completed") } updateLinks function (NOK): func updateLinks() { var erreur = "fetch request <Link>" let request: NSFetchRequest<Link> = Link.fetchRequest() request.entity = Link.entity() print("Running patch...") do { request.predicate = NSPredicate(format: "gives == nil") let links = try viewContext.fetch(request) for link in links { let baseDraw = link.back!.draw! print("\(baseDraw) \(link.letter!)") let augmDrawLetters = String((baseDraw + link.letter!).sorted()) if let augmDraw = getDraw(drawLetters: augmDrawLetters) { viewContext.perform { let updateLink = link as NSManagedObject updateLink.setValue(augmDraw, forKey: "gives") erreur = " saving \(augmDraw.draw!) \(link.letter!)" do { try viewContext.save() } catch { print("Erreur mise à jour lien") } } } } } catch { print("Error " + erreur) } } RESULT And this is the output showing the content of the Draw entity with relationships after createLinks() is applied: And here after updateLinks() is applied :
2
0
995
Feb ’25
Cloudkit only syncs when app is reloaded.
I've seen a few older posts claiming the same behavior I'm seeing which is my cloudkit/core data app only syncs to iOS when the iOS app is reloaded. Can someone clarify if this is a bug, or the expected behavior. I have an iOS app which the entire purpose of it is to view synced data from MacOS, and I have a refresh button which does nothing because the data only syncs when the app is closed and reopened. Am I supposed to tell users to close and reopen the app to see fresh data? that seems like a terrible UI behavior, and I know apple does not accept this as all of their apps sync without needing to be reloaded. For example the notes app does not need to be reloaded for the MacOS -> iOS data to be synced.
Topic: Design SubTopic: General Tags:
1
0
918
Oct ’25
iOS 26 Modal View Controller with Transparent Background
Prior to iOS 26, this successfully gave me a modal view with a transparent background: let settingsVC = MySettingsViewController() settingsVC.modalPresentationStyle = .automatic //settingsVC.modalPresentationStyle = .overCurrentContext self.present(settingsVC, animated: true, completion: { } MySettingsViewController: self.view.backgroundColor = UIColor(white: 0, alpha: 0.5) Now in iOS 26, modal view is presented in a opaque grey background.
Topic: Design SubTopic: General Tags:
0
0
648
Oct ’25
Ask about SF symbols
Hi, I would like to make an educational app for helping my students to learn about malaria diagnosis and need to put some animal icon. In the tabview, is it possible to use system images like monkey, bird, mouse. I cannot see these animals in SF symbol list.
Topic: Design SubTopic: General
3
0
165
May ’25
Handling Context Save Errors
I was wondering if errors are common for the code below for saving SwiftData data and what would be the best way to handle them (popup, closing the app)? do { try modelContext.save() } catch { print("error") }
Topic: Design SubTopic: General Tags:
1
0
241
3w
MusicKit design guidelines
Hi community, I have a question regarding MusicKit, is it necessary to follow a design guideline to integrate this framework into my App? Also, when no music is reproducing in MusicKit which placeholder we should show, do you provide the resource? Or can we create our own placeholder? Thanks for all, David.
1
0
674
Feb ’25
Custom Button Image Sizing Issue
Hello, Im new to Xcode, ive been taking some classes and watching YouTube videos as well as using AI. Im having an issue I cannot find a video on, and AI just keeps screwing up my layout and sizing. Here is the issue, I have a Custom Made Image for my Sign In button, for my log in page on Xcode. The issue being that I can barely see the button and when I go to adjust the size the whole layout gets screwed up. My Logo Image (supposed to take up the top 50% of the screen) takes over the whole Botton of the screen and I loose my username and password Text threads and images. I guess my question is, is this an issue with the size of image ive uploaded or is this an issue with my code? I changed the size of the Image I created in Canva to 900pixles for the width and 300pixals for the height and that did absolutely nothing to my image in Xcode. Below is the Button and Create Account section in my code that seems to be having issues. Ppppplease help me. var body: some View { NavigationStack(path: $navigationPath) { ZStack { // Background image Image("Background1") .resizable() .scaledToFill() .ignoresSafeArea() .clipped() // Main content ScrollView { VStack(spacing: 20) { // Logo Image("DynastyStatDropLogo") .resizable() .scaledToFit() .padding(.top, -160) .padding(.bottom, -30) // Form elements // Username field ZStack { Image("UsernameBar") .resizable() .aspectRatio(contentMode: .fill) .padding() TextField("UserName:", text: $textInput) .padding(.horizontal, 75) .background(Color.clear) .foregroundColor(.red) .focused($focus, equals: .username) .submitLabel(.next) .onSubmit { focus = .password } } .frame(height: 50) .clipShape(RoundedRectangle(cornerRadius: 10)) .padding(.horizontal) // Password field and Forgot Password link VStack(spacing: 20) { ZStack { Image("PasswordBar") .resizable() .aspectRatio(contentMode: .fill) .padding() SecureField("Password:", text: $textInput2) .padding(.horizontal, 75) .background(Color.clear) .foregroundColor(.red) .focused($focus, equals: .password) .submitLabel(.go) .onSubmit { submitForm() } } .frame(height: 50) .clipShape(RoundedRectangle(cornerRadius: 10)) .padding(.horizontal) // Forgot Password link (right-aligned) HStack { Spacer() Text("Forgot Password?") .foregroundColor(.blue) .onTapGesture { navigationPath.append("passwordRecovery") } } .padding(.horizontal, 90) } Spacer(minLength: -110) // SignIn Button - Explicitly showing it HStack { Spacer() Button { submitForm() } label: { Image("signinButton") .resizable() .frame(width: 500, height: 400) } Spacer() } Spacer(minLength: -300) // Create Account (centered) HStack { Spacer() Text("Create Account") .foregroundColor(.blue) .onTapGesture { navigationPath.append("accountCreation") } Spacer() } .padding(.bottom, -10) } } } .onAppear { focus = .username } .navigationDestination(for: String.self) { destination in switch destination { case "dashboard": DSDDashboard() case "passwordRecovery": PasswordRecoveryView() case "accountCreation": AccountCreationView() default: EmptyView() } } .alert(isPresented: $showAlert) { Alert( title: Text("Missing Information"), message: Text("Enter UserName and Password to continue to DSD"), dismissButton: .default(Text("OK")) ) } } } // Function to handle form submission func submitForm() { focus = nil if textInput.isEmpty || textInput2.isEmpty { showAlert = true } else { print("Login with username: \(textInput), password: \(textInput2)") navigationPath.append("dashboard") } } // Enum to manage focus states enum FormFieldFocus: Hashable { case username, password } }
Topic: Design SubTopic: General
1
0
99
Mar ’25
List View within a Scrollview
The bane of my existence has been designing interfaces where the whole view needs to scroll, but a portion is a List and the other portion is static. I run into this problem time and again so I was hoping someone has a good solution because we all know that embedding a List view inside ScrollView is a no-go within SwiftUI. It simply doesn't work. So what is a best practice when you need the whole screen to scroll, but a portion is a List? Use a navigation stack instead of a ScrollView? What if it's a child view of a navigation stack already?
Topic: Design SubTopic: General Tags:
2
0
773
Jul ’25
UITabBarController with sidebar on iPadOS 18
When I create a tab group for the sidebar on iPad, the title and disclosure triangle act like a single control. Every time I tap the section title, the disclosure triangle for that section activates and hides or exposes that section's children and actions. I want the section title to behave like Photos, where tapping a section title just displays its view controller, and the disclosure triangle is a separate control that must be tapped to hide and show children and actions. I did not see any delegate methods that would let me control this behavior. Is this supported?
1
0
199
May ’25
Apple Intelligence and Siri
I downloaded iOS 26 beta 3. I was very happy with how it turned out, but when I activated Siri, I noticed the rainbow pulsing glow that bordered the phone was missing, and all that was left was the original Siri bubble. I was very disappointed, does anyone know how to get this back? I loved that design feature.
1
0
350
Jul ’25
Urgent Feature Request: Auto-Hide Home Bar in iOS 18.x Based on iOS 26 Beta Experience
Hello Apple Engineering Team and Fellow Developers, I’ve been using iOS 26 beta from day one and closely following all its improvements. One feature that significantly enhances the user experience is the automatic hiding of the Home Bar (the bottom navigation indicator) after a few seconds of inactivity in menus and apps. This subtle but powerful UI behavior not only increases immersion but also reduces distractions, making navigation smoother and visually cleaner. I strongly urge the Apple team to integrate this feature into the upcoming iOS 18.6 update. Bringing this polished interaction to iOS 18 users would greatly improve usability and keep the interface modern and elegant. Thank you for your continuous efforts in refining iOS. Looking forward to seeing this improvement officially adopted soon! Best regards, [ERFANEX]
Topic: Design SubTopic: General
3
0
582
Jul ’25
CloudKit not storing or updating public data in real time.
My newly released App Snapshot-Chess-Move, #1592848671, is not creating a public database of chess moves as I expect. What steps do I need to do inorder for my App to be using a public database. It appears as if each of my iOS devices, iPhone, iPad and Mac mini each have a private database of chess moves. When I change my data on the iPad, I expect the new data to appear (with slight delays) on the Mac.. I do not know what to do next. Please help me. This was working in Development mode but not in Production when I submitted my App for release. UPDATE: The cloud data is copied locally to a @Quary variable and updated by using .insert, .delete and .save commands. So, I deleted and re-downloaded my apps on each device, iPad, iPhone, and Mac and obtained the same cloud data. So how do users get the most recent copy of the cloud. Do they need to delete their App and start over? Is there a .update command that can do this updating for me? Also, I pushed the App out of the background and restarted the App to obtain the updated cloud data.
Topic: Design SubTopic: General Tags:
3
0
169
Apr ’25
Huge UI difference between Simulator and Real Device
Hi everyone, I’m testing our SwiftUI app on both Xcode simulator and a real iPhone. On the simulator, everything looks clean and aligned. But when I run it on an actual iPhone (same build, iOS 18), the layout looks broken—fonts overlap, spacing is off, and elements are misaligned. Both screenshots are from the exact same screen and time. First is simulator, second is iPhone. Any idea why this difference happens? Is there something I should check in terms of rendering or layout settings? Thanks in advance!
1
0
277
Jul ’25