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

Post

Replies

Boosts

Views

Activity

18.2 Beta. How to disable! EYESORE and DISTRACTING NOISE!
MY iphone just updated to Beta 18. Now there are what appears to be category pictures next to each email as displayed on the phone. It is an eyesore and distracting to see or follow emails cleanly with this feature. Ok to have those pictures if people categorize or choose categorize option, BUT I DO NOT. Does anyone know how to disable this odd and useless picture? I have tried LIST VIEW option, but it did nothing. Thank you!
0
0
80
23h
Apple Pay guidelines clarification
Hello there, I have a couple of question about Apple Pay guidelines: • if we offer Apple Pay payment method in our app, can we disable the selection (I mean the method selection NOT the Payment button!) IF certain condition happens? E.g. the user cannot select apple pay payment method because our basket is not ready yet. • Are we forced to move the apple pay payment method on the top of our selection? E.g. Cards, Cash On Delivery, Coupon, Apple Pay --> Apple Pay, Cards, Cash On Delivery, Coupon One last technical question: • when we start the payment process we are gonna create the request and present the sheet BUT we have to call our backend for pre-authorization, is it allowed? @objc private func applePayButtonTapped(sender: UIButton) { // TODO: Is it allowed? // We need to ask to our backend a pre-authorization and THEN procced with Apple Pay flow // but this could be done ONLY after the user TAP on BUY with APPLE PAY and BEFORE // paymentAuthorizationViewController is called. // Are we compliant to do that? if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: FakeData.paymentInfo()) { let request = PKPaymentRequest() request.blablabla = blabla let authorizationViewController = PKPaymentAuthorizationViewController(paymentRequest: request) if let viewController = authorizationViewController { viewController.delegate = self present(viewController, animated: true, completion: nil) } } } Thanks in advance :)
1
0
597
May ’24
Can I Implement an Exit Button in an iOS App?
I am an iOS app developer and I have a question regarding the implementation of an exit button in an iOS app. I remember reading in the past that Apple does not recommend this practice, but I couldn’t find any explicit policy on this matter in the current Human Interface Guidelines. Could you please clarify whether it is acceptable to implement an exit button in an iOS app according to the latest guidelines? Any references or official documentation would be greatly appreciated.
2
0
124
1d
Issues with UserDefault boolean
Hi, I have a view that should do the following: Set up and confirm a passcode upon account creation. Verify passcode if signing in. Reset passcode if prompted. With the code below, functions 1 and 2 are working. However, I'm having an issue with function 3. I am able to declare the reset UserDefault on a previous view so that the proper logic occurs, which is to read in the input, and then confirm it. However, it is not working as intended. In this code here: else if reset { UserDefaults.standard.set(passcode, forKey: "new-passcode") UserDefaults.standard.set(false, forKey: "reset-passcode") passcode = "" } I store the new passcode, set reset to false, and clear the passcode so it can be entered again to confirm. The code does not run as intended however. The title does not change and I'm unsure if it is actually storing the passcode. And, when re-entering, it does not change the view as it should by setting view = .someView. I'm assuming there is just flaw in my logic but I'm not sure how to resolve this. Below is the full code. Please let me know if any further clarification is needed. struct EnterPasscode: View { @State var title = "" @State var passcode = "" @State var message = "" @State var buttonState = false @Binding var view: Views var body: some View { Group { Spacer() .frame(height: 50) Text(title) .font(.system(size: 36)) .multilineTextAlignment(.center) .frame(height: 50) Spacer() if passcode != "" { Text("\(passcode)") .font(.system(size: 24)) .frame(height: 25) } else { Spacer() .frame(height: 25) } Spacer() .frame(height: 50) PasscodeKeypad(passcode: $passcode) Spacer() if message != "" { Text(message) .frame(height: 25) .foregroundStyle(Color.red) } else { Spacer() .frame(height: 25) } Spacer() WideButton(text: "Continue", buttonFunction: .functional, openView: .enterPasscode, view: .constant(.enterPasscode), buttonState: $buttonState) .onChange(of: buttonState) { oldState, newState in if buttonState { let passcodeSet = UserDefaults.standard.bool(forKey: "passcode-set") let storedPasscode = UserDefaults.standard.string(forKey: "passcode") let reset = UserDefaults.standard.bool(forKey: "passcode-reset") let newPasscode = UserDefaults.standard.string(forKey: "new-passcode") print(reset) if passcode.count == 4 { if storedPasscode == nil { if newPasscode == nil { UserDefaults.standard.set(passcode, forKey: "new-passcode") passcode = "" } else if passcode == newPasscode { UserDefaults.standard.set(passcode, forKey: "passcode") UserDefaults.standard.set(true, forKey: "passcode-set") view = .someView } } else if reset { UserDefaults.standard.set(passcode, forKey: "new-passcode") UserDefaults.standard.set(false, forKey: "reset-passcode") passcode = "" } else if newPasscode != nil { if passcode == newPasscode { UserDefaults.standard.set(passcode, forKey: "passcode") view = .someView } } } checkPasscodeStatus() buttonState = false } } Spacer() if !UserDefaults.standard.bool(forKey: "passcode-reset") && UserDefaults.standard.bool(forKey: "passcode-set") { Button(action: { view = .verifyPhone }) { Text("Forgot passcode?") .foregroundStyle(.black) } } Spacer() .frame(height: 25) } .onAppear() { checkPasscodeStatus() } .frame(width: UIScreen.main.bounds.width - 50) } func checkPasscodeStatus() { let passcodeSet = UserDefaults.standard.bool(forKey: "passcode-set") let storedPasscode = UserDefaults.standard.string(forKey: "passcode") let reset = UserDefaults.standard.bool(forKey: "passcode-reset") if reset { title = "Enter new passcode" } else if passcodeSet { title = "Enter Passcode" } else if storedPasscode != nil && storedPasscode != "" { title = "Confirm Passcode" } else { title = "Select a 4 Digit Passcode" } } } struct WideButton: View { @State var text: String @State var buttonFunction: ButtonType @State var openView: Views? @Binding var view: Views @Binding var buttonState: Bool var body: some View { Button(action: { buttonPressed() }, label: { ZStack { RoundedRectangle(cornerRadius: 5) .fill(Color.black) .frame(width: UIScreen.main.bounds.width - 50, height: 50) Text(text) .foregroundColor(.white) } }) } func buttonPressed() { switch buttonFunction { case .openView: view = openView! case .functional: buttonState = true } } } enum ButtonType { case openView case functional }
3
0
184
5d
Setting unable seach for app
In the previous version it was possible in the setting to search directly for an app, and then go on the setting and for example disable the notifications. In iOS 18 you cannot do it anymore, you have to click on notification, and then search by scrolling the full list. It would be nice if you can add again the search feature for the apps in the settings.
0
0
103
3d
New iOS 18
The format of photos on the new iOS 18 and its updates is HORRIBLE. Not userfriendly, not easy to navigate, not even appealing to the eye. I can’t even see my favorites album anymore and have to search for it every time. In short, I hate it. Well done Apple
2
0
191
6d
Behavioral change in iOS 18 related to SCEP profile downloads from the browser.
Hi Team, We have noticed a behavioral change in iOS 18 related to SCEP profile downloads from the browser. In current flow, we are using Cisco ISE as SCEP server. While testing in iOS 18, we have observed that before communicating to SCEP server iOS is asking to download the SCEP server certificate. This differs from iOS 17.4, where the communication happens seamlessly without any new prompts. Could you please confirm if this certificate download popup behavior is expected in iOS 18? Additionally, we would appreciate any guidance on whether this change in likely to persist in future updates, as it impacts our user flow. Please let us know where we can attach video recordings of previous and current processes. Thanks
2
0
165
6d
Universal link opening excluded path on the app instead of browser.
I need my app to open all other links except domain.com. But clicking on domain.com still opens the app though I have added 'excluded': true. Below is my aasa file { "applinks": { "apps": [], "details": [ { "appID": "com.domain", "paths": ["NOT /"], "components": [ { "/": "/", "exclude": true }, { "/": "/biz/*" }, { "/": "/offers/deal-detail*", "?": { "oId": "*" } }, { "/": "/review/*" }, { "/": "/emailActionHandler*" } ] } ] } } I have also tried to verify this with swcutil tool, and it gives the right matches and blocks 'domain.com'. But the actual behavior on an iOS device is not the same.
1
0
154
1w
Image playground early access
Ii have been waiting a couple of days for access to image playground also. I wonder if having my VPN activated during my initial early access request right after I installed 18.2 somehow put me in some sort of loop that’s not allowing me to be granted access. Is there anyone that has been waiting that had their VPN on when they requested early access?
1
0
452
1w
image playground
it's unfair how some people have full access to Image Playground and others have to wait for hours and days I don't understand why Apple doing stuff like this to the customer treated everyone equally
3
0
166
1w