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.

Learn about designing great app and game experiences

Posts under General subtopic

Post

Replies

Boosts

Views

Activity

Ios26 beta 3 concerns about liquid glass design
With the new ios 26 beta 3 helps some stabillty and performance issues but most of the liquid glass has been removed or made very frosty look; and it defeats the whole purpose of a big redesign, and even thought the changes are because of readability and contrast complaints it should not take away liquid glass design. I think apple should consider adding a toggle or choice to choose if they would want a more frosted look or a more liquid glass look the the original plan.
Topic: Design SubTopic: General Tags:
1
1
246
Jul ’25
Keyboard dismissed when switching apps
Scenario is when keyboard is opened within the app being developed then switch to other app, for instance, Notes app and create a note to enable keyboard from there. While the Notes app keyboard is active switch back to the developed app the keyboard in it is dismissed. Any thoughts?Thanks
1
0
84
Apr ’25
Liquid Glass is not just decoration it is the soul of iOS 26
As someone who genuinely appreciated the Liquid Glass effect introduced in iOS 26 Beta 1–2, I am deeply disappointed by its reduction in Beta 3. Liquid Glass wasn’t just eye candy it gave iOS a unique identity, futuristic feel, and a visual soul. Now, the UI looks flat, generic, and indistinguishable from other platforms. I feel Apple is stepping back from a bold vision due to readability complaints that could’ve been solved with an option or toggle not by removing the whole design language. Please consider restoring the full Liquid Glass look, or at least offer a toggle so users who believe in Apple’s design language can choose it. Don’t let this innovation fade because of short-term complaints.
Topic: Design SubTopic: General
1
2
276
Jul ’25
Getting original LocationNode from hit tested SCNNode
I would like to modify the content of a published LocationNode upon been clicked by the user. But unfortunately: func hitTest(_ point: CGPoint, options: [SCNHitTestOption : Any]? = nil) -> [SCNHitTestResult] returns an SCNNode array from which it is impossible to retrieve the original LocationNode being inserted in order to be able to modify it. Of course the solution would be to either insert the SCNNode corresponding to the inserted LocationNode in a custom class or conversely insert the identifier of the custom object as a tag of the LocationNode, in order to solve the issue. But both options seem impossible to implement. May anyone help me?
1
0
90
Apr ’25
Liquid Glass App Icons without Icon Composer
We have found that on iOS 26 beta some of our app icons built from an Xcode 16 asset catalog containing a single 1024x1024 .png file have a Liquid Glass effect applied to them while others have not. The documentation states that If you choose not to use Icon Composer, you can still use an AppIcon asset catalog in your project containing individual app icon images and let the system apply the Liquid Glass material. and If you prefer, you can take advantage of the system’s automatically generated treatment that is applied to all app icons. Is there any insight into how the system treats app icons that have not yet been updated with Icon Composer?
1
1
2.2k
Nov ’25
About tvOS Material (design resource)
I noticed a discrepancy between the Material specifications for tvOS on the Developer page and the naming in the Design Resources (Sketch files). Which one should we consider authoritative? https://developer.apple.com/design/human-interface-guidelines/materials
1
0
94
Apr ’25
unable to optimize App for iPad
I use swiftui to build apps on iPhone and iPad. There is no problem with the iPhone app. The game display is fully shown on iPhone. However, for the iPad, the game display is not shown and the screen goes black. I had to tap the button on the upper left side.(looks like a side view button) After that, the game display is only shown in the left side in a very small size. How can I make the game display fully shown in the iPad?
2
0
122
Apr ’25
Email icons
The most recent update included coloured icons for grouping of emails anybody previously needing to group emails we’re able to achieve this alphabetically by simply searching for what you were looking for. These icons clutter the page with totally unnecessary screen pollution. if you want to persist with this folly can you please provide a classic display option for those of us who have happily survived using email for 30 years without this fluff.
Topic: Design SubTopic: General Tags:
2
0
621
Feb ’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
i am struggling to get my tab view to work,
i am struggling to get my tab view to work, when i call views in the action part of my tab view, my background creates issue? does anyone know how to fix this? struct ContentView: View { @Environment(.colorScheme) var colorMode let Color1: Color = .cyan var Color2: Color { colorMode == .dark ? .black : .white } var TextColor: Color{ colorMode == .dark ? .black : .black } let tax: Double = 0.0875 var OptionTypes: [String] = ["Breakfeast", "Lunch", "Dinner", "Dessert", "Drinks"] var BreakfeastFoods: [Food] = [ Food(Name: "Eggs Benedict", Price: 9.50), Food(Name: "Avocado Toast", Price: 5.75), Food(Name: "French Toast", Price: 12.50), Food(Name: "Waffles", Price: 7.25), Food(Name: "Pancakes", Price: 8.60) ] var LunchFoods: [Food] = [ Food(Name: "Tuna Salad", Price: 11.25), Food(Name: "Pizza", Price: 22.50), Food(Name: "Chicken Sandwitch", Price: 8.95), Food(Name: "French Fries", Price: 5.15), Food(Name: "Macaroni and Cheese", Price: 7.50) ] var DinnerFoods: [Food] = [ Food(Name: "Ribeye Steak", Price: 18.99), Food(Name: "Pork Ribs", Price: 21.75), Food(Name: "Salmon", Price: 15.00), Food(Name: "Burrito Bowl", Price: 13.99), Food(Name: "Chicken Fajitas", Price: 20.50) ] var DessertFoods: [Food] = [ Food(Name: "Ice Cream Sundae", Price: 10.00), Food(Name: "Fudge Brownie", Price: 4.85), Food(Name: "Chocolate Cake Slice", Price: 6.10), Food(Name: "Pumpkin Pie", Price: 6.10), Food(Name: "Ice Cream Float", Price: 3.50) ] var Drinks: [Food] = [ Food(Name: "Water", Price: 0.00), Food(Name: "Sparkling Water", Price: 2.15), Food(Name: "Soda", Price: 3.00), Food(Name: "Coffee", Price: 2.50), Food(Name: "Hot Chocolate", Price: 3.50) ] @State var MyCart: [Food] = [] var body: some View { NavigationStack{ ZStack{ LinearGradient(colors: [Color1, Color2], startPoint: .top, endPoint: .bottom).ignoresSafeArea() VStack(spacing: 40){ ForEach(OptionTypes, id: \.self){ OptionType in NavigationLink(value: OptionType){ Text(OptionType) }.frame(width: 250, height: 70).background(LinearGradient(colors: [.cyan, .white,.cyan], startPoint: .topLeading, endPoint: .bottom)).foregroundStyle(TextColor).cornerRadius(100).font(.system(size: 25, weight: .medium)).padding(.top, 16) } }.navigationDestination(for: String.self) { OptionType in switch OptionType{ case "Breakfeast": BreakFeastView(BreakfeastList: BreakfeastFoods, Color1: Color1, Color2: Color2) case "Lunch": LunchView(LunchList: LunchFoods, Color1: Color1, Color2: Color2) case "Dinner": DinnerView(DinnerList: DinnerFoods, Color1: Color1, Color2: Color2) case "Dessert": DessertView(DessertList: DessertFoods, Color1: Color1, Color2: Color2) case "Drinks": DrinksView(DrinksList: Drinks, Color1: Color1, Color2: Color2) // case "My Cart": // MyCartView(MyCartList: MyCart, Color1: Color1, Color2: Color2) default: Text("Error") } } } .navigationTitle("Choose Menu") TabView{ Tab("Menu", systemImage: "fork.knife"){ } Tab("My-Cart", systemImage: "cart.fill"){ } Tab("Store Location", systemImage: "mappin"){ } } } } }
Topic: Design SubTopic: General Tags:
2
0
461
Jul ’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
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
128
Aug ’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
Plagiarism
Hello. I've made a shape in the app which looks like the hello sign on apple products at startup. Is this considered plagiarism, or is it acceptable to use it in an app? P.s: i've used Path for it and drawed it with curves
2
0
671
Feb ’25
Navigation item title compact size with large text iOS26
Hi there. Our designer is designing our app in Figma with the navigation element with compact size navigation bar, and large title. I couldn't find an API to actually configure the nav bar to be compact while keeping the large title enabled. Figma uses the libraries provided by Apple so it's weird I can't find such configuration in iOS26. I'm adding a screenshot of the options in Figma. First option is: Large size & large text. The one our designer is using is compact size & large text.
Topic: Design SubTopic: General Tags:
2
0
1.7k
Sep ’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
289
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