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

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
562
Jul ’25
Scrollview and a background image set to scaledToFill....
I've been beating my head against the wall over a scrollview issue where the top and bottom are cut off in landscape mode. Portrait mode - everything runs swimmingly. The moment I flip the iPad on its side, though, I lose about a quarter of the view on the top and bottom. I thought this was something to do with framing or such; I ran through a myriad of frame, padding, spacer, geometry...I set it static, I set it to dynamically grow, I even created algorithms to try to figure out how to set things to the individual device. Eventually, I separated the tablet and phone views as was suggested here and on the Apple dev forums. That's when I started playing around with the background image. Right now I have.... ZStack { Image("background") .resizable() .scaledToFill() .ignoresSafeArea() ScrollView { VStack(spacing: 24) {.... The problem is the "scaledToFill". In essence, whenever THAT is in the code, the vertical scrollview goes wonky in landscape mode. It, in essence, thinks that it has much more room at the top and the bottom because the background image has been extended at top and bottom to fill the wider screen of the iPad in landscape orientation. Is there any way to get around this issue? The desired behavior is pretty straightforward - the background image fills the entire background, no white bars or such, and the view scrolls against it.
3
0
143
Apr ’25
Notification badge with no indication number
I'm looking for a way to display a notification badge without showing a number—essentially, just an empty badge to indicate the presence of notifications. From my research, it seems like this functionality isn't available . Is there any workaround or method to achieve this?
Topic: Design SubTopic: General
3
0
77
May ’25
The airdrop was sent to the wrong device. Will modifying the interface in this way reduce the error
I have many Apple devices, such as macbook, iPad and iPhone. It's very convenient for me to transfer files between devices. However, when I want to send files to my own device in public places, I often click on the wrong recipient because the list avatar keeps changing. I hope the list of recipients can be grouped One group is my own device (or the one I often send to), and the other group is other devices. When the user is about to send, the mouse will be in a relatively fixed and mentally expected area. I feel that this can reduce the probability of sending wrongly
Topic: Design SubTopic: General
3
0
606
2w
Wrong unit in HIG > Components > System Experiences > Widget > watchOS widget dimensions
Hello, I noticed a small mistake in the Human Interface Guidelines (HIG). On the page HIG > Components > System Experiences > Widget > watchOS Widget Dimensions, scroll down to the bottom. In the "watchOS widget dimensions" section, the sizes in the table are in pixels (px), not points (pt) actually. However, the table header indicates the sizes should be in points (pt). Page link: https://developer.apple.com/design/human-interface-guidelines/widgets#watchOS-widget-dimensions For example, the widget size in the Smart Stack on a 49mm watch should be 192x81.5 pt (or 382x163 px), not 382x163 pt. This size can be verified with the information provided here: https://developer.apple.com/documentation/watchos-apps/supporting-multiple-watch-sizes/. https://developer.apple.com/documentation/watchkit/wkinterfacedevice/1620974-screenscale
Topic: Design SubTopic: General Tags:
3
0
853
Jan ’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
133
Apr ’25
Liquid Glass support : Best practices for navigation button styles in iOS 26 and later
Hello! I'm currently working on Liquid Glass support for my app. I understand that starting with iOS 26, standard buttons like "Close" or "Done" have shifted from text buttons to using SF Symbols, as mentioned in the Human Interface Guidelines under "Icons". However, on iOS 18 and earlier, the flat text button style remains the standard. I am unsure about the best approach for backward compatibility: Branch by OS version: Keep text buttons for older OS versions and use SF Symbols for iOS 26+. Concern: This increases the number of conditional branches, potentially reducing code readability and maintainability. Adopt SF Symbols universally: Use SF Symbols for all versions. Concern: I feel that SF Symbols do not fit well (look inconsistent or out of place) with the flat design language of iOS 18 and earlier. What would be the recommended approach in this situation?
Topic: Design SubTopic: General Tags:
3
0
710
5d
Guideline 4.3(a) - Design - Spam - automatic rejection
I previously written here, and some advices were to appeal to rejection sending them message describing uniqueness of the app. Nothing is working. In short, i have a vpn app (of course by design shares some concept with other apps that are in the app store). But since the rejection i have completely changed the ui, added built in browser, p2p messenger so users could interact with each other without any interference. The app is completely free with no ads. I thought this is it, there's no way it would reject this time, but... i get a notification with rejection repeating the same old message. I'm extremely frustrated and don't know what to do. Tried changing the logo of the app, the name to "Incognito - Messenger, VPN", app store screenshots. I've already appealed with screenshots describing unique features that other vpn apps don't have, but the message just repeats from app review team. Submission ID: 1a49ee0b-c4e2-4a36-8372-e4d3b9a8b13f Does anybody have an advice what i can do?
3
0
2.0k
Jan ’25
iPad/iPhone - Display best practices….
So…I am hitting a wall here and could use some guidance towards best practice. I’ve developed an app in Xcode/SwiftUI that renders just fine on the iPhone - text, images, buttons, frames…everything is nicely centered on the screen or scrolls where and when I want. The iPad though…not so much. I’m having issues with tops and bottoms being cut off in scrollviews. These are just straight up text screens too - the ones with other elements/controls…they’re rendering fine. I’ve tried a mix of geometry, vstack, scrollview, padding, spacers…the lot of it. Nothing I seem to do works - the views do not want to fill and fit properly. And, of course, the issue becomes worse the moment you flip the iPad into landscape view. Or use the 13” models. I’d imagine others are battling these issues as well and found solutions, so I decided to hit up the brain trust.
3
0
153
Apr ’25
IS THE SWiPE LEFT CAMERA MODE REALLY IMPORTANT?
I have really examined the swipe left Camera function mode and sincerely believe it is no more important especially when there no option in the settings to turn it on or off. I will highly recommend a total scrap in the iOS 26 or if possible a function to activate and deactivate it.
Topic: Design SubTopic: General
3
0
331
Aug ’25
Struggling creating a custom SF Symbol: The provided variants are not interpolatable
Hi, I am trying to create a custom SF Symbol from an SVG file created with Affinity Designer but, even though my SVG file look perfect in Firefox for example compared to the exported custom.circle.svg file (as recommended in Apple's documentation), I fail to get rid of this error: "The provided variants are not interpolatable" My creation process using Affinity Designer is: Export as SVG file Duplicate the custom.circle.svg file exported from the SF Symbols app In the new file, replace the 3 "path" tags in the "g" sections "id="Black-S", "Regular-S", "Ultralight-S" with the paths from the SVG file exported from Affinity designer Set the 3 transform matrices to "matrix(1 0 0 1 0 0)" for the 3 variants to be generated at the correct location. Verify in an SVG viewer that the file looks correct. Import the file via Drag&Drop into the SF Symbols app. What is wrong with my file? Thank you in advance for any help, Marc mySymbol.svg.txt
Topic: Design SubTopic: General Tags:
3
0
159
Jun ’25
Converting iPad app to an iPhone app
I have an iPad developed using UIKit and storyboards now I have to develop UI for iPhone. Designs for iPhone app are completely new from iPad app also navigation is different. I have question regarding should I make different view controllers for iPhone and iPad and different storyboard
Topic: Design SubTopic: General Tags:
2
0
499
Jan ’25
How can a student start learning Apple’s approach to design?
Hello everyone, I'm 14 and absolutely enthusiastic about Apple — not only the products themselves, but the design nuance, the sense that everything has been well thought-out, and even stuff like Fitness+ and the Tips app. I love how much attention Apple pays to making every aspect of the experience feel deliberate and cohesive. My dream is to eventually become an Apple employee, specifically in design (maybe even retail for the beginnin). I know that I am young right now, but I would like to start learning as soon as possible. To you all who have experience with design or anything else, what are a few things or habits one my age should focus on learning to strengthen in the right direction? to maybe reach this dream Any assistance or advice would be greatly appreciated. Thanks! chase
Topic: Design SubTopic: General
2
0
483
Sep ’25
How can I force a function only runs once during the whole app lifecycle?
Hi, I want to generate some sample datas for demonstrating the functions of my app when the app launched. My codes are as followings: func generateSampleData() { let hasLaunchedKey = "HasLaunchedBefore" let defaults = UserDefaults.standard if !defaults.bool(forKey: hasLaunchedKey) { //generate the demo data } defaults.set(true, forKey: hasLaunchedKey) } And I put the func in a view's onAppear modifier. I found every time I go the view, it generates the demo data again, which results in producing a lot of demo data. But I have set the status of the function running in the userdefault. Why did it happen? Best Wishes,
Topic: Design SubTopic: General
2
0
127
Aug ’25
App Release
While doing production release of app, I was not able to see phase release option like in my previous releases. Due To whihc when I released. the app , it got released to 100% users. I want to know why phase release option was not showing up in my dashboard
Topic: Design SubTopic: General
2
0
601
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
977
Feb ’25
Can't get a simple network call working. Novice developer.
Here is my code and the error code being generated during build. let myString : String = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=AAPL&apikey= D5GY7HKODE66G0T9" var banjo = URL(string: myString) let task = URLSession.shared.dataTask(with:banjo ) { myDatastring , response , error in} // task.resume() I've tested that URL in my browser and it works. But when I try to build I get: Value of optional type 'URL?' must be unwrapped to a value of type 'URL' Please tell me what I'm doing wrong. I think the URL struct is not returning a URL type of object.
Topic: Design SubTopic: General
2
0
287
Sep ’25
Inconsistencies with activityBackgroundTint when a device switches between light and dark modes
While the activityBackgroundTint modifier is intended to set the background color of a Live Activity, it often fails to dynamically update, leaving the activity with an incorrect background. Replacing it with ZStack { Color(.background) .... } solves the problem, but this is a workaround. The activityBackgroundTint modifier is still needed, at a minimum, so that the "Allow Live Activity for the app" extension does not have the default color.
Topic: Design SubTopic: General Tags:
2
0
505
Sep ’25
Can't make buttons rectangular!
Ever since Xcode Version 26.0.1 I cannot for the life of me make my buttons rectangular. They are all capsule (or oval) shaped. My interface was designed for square buttons but no matter what I do the issue stays the same. This is what I have (it's fairly barebones but would have worked before I believe): @IBOutlet weak var PagesInterface: UIButton! override func viewDidLoad() { super.viewDidLoad() PagesInterface.layer.cornerRadius = 0 PagesInterface.layer.masksToBounds = true }
2
0
573
Oct ’25