Create elegant and intuitive apps that integrate seamlessly with Apple platforms.

Posts under Design tag

82 Posts
Sort by:

Post

Replies

Boosts

Views

Activity

Use of 64pt and 68pt iOS App Icon Sizes
Hi there! Back with Xcode 14 and iOS 16 there were two new app icon sizes introduced to iOS: 64pt @2x (128x128px) 64pt @3x (192x192px) 68pt @2x (136x136px) What are those icons used for? Neither the Xcode 14 release notes nor the Human Interface Guidelines are mentioning those sizes and what they are used for. In previous Xcode versions the asset catalog had labels for each icon size. As Xcode 15 still doesn’t bring that feature back I’m still puzzled when those icon sizes are visible to the user. Best! – Alex
2
0
1.8k
3w
Rejected app
Hello, I have this issue. I don’t know what do I need to chang. can you help pleas. This app duplicates the content and functionality of other apps submitted by you or another developer to the App Store, which is considered a form of spam. Specifically, this app appears to be available in the same territories as another identical app submitted to the App Store. It would be appropriate to restrict the available territories for individual apps to those areas in which you intend to market and sell it and ensure none of the selected territories overlap. Apps that simply duplicate content or functionality create clutter, diminish the overall experience for the end user, and reduce the ability of developers to market their apps. The next submission of this app may require a longer review time.
0
0
507
Jul ’23
Ways to implement a http/s interceptor read the headers and body and block/allow that http/s call.
Hello everyone, I am new to MacOS app development and I'm currently working on implementing an HTTP/S interceptor in my application. I would like to know if there are any available APIs or network events that I can listen to in order to intercept HTTP/S calls made by all the applications installed in my MacOS, read their headers and body, and have the ability to block or allow those calls. Any guidance or suggestions would be greatly appreciated. Thank you, Venkata Sesha Phani.
3
1
940
Jul ’23
App rejection issue
Specifically, your screenshots includes non-iOS status bar images. We noticed that your submission includes information about third-party platforms that may not be relevant for App Store users. Specifically, your screenshots includes non-iOS status bar images. Referencing third-party platforms in your app or its metadata is generally not relevant for App Store users, who are focused on the experiences offered by their current device.
2
0
601
Jul ’23
Navigate from a modal to a different tab
Good day, we design an app where we have a fullsceen modal where we advertise a new function that lives in a different part of the app. In the bottom we have a CTA. Pressing the CTA should close the modal and redirect to a different parent tab where the user can perform the desired actions. Has this been done? What are your thoughts on the UX? Too weird? Helpful? Any other ideas on how we can help get a user from the startscreen to a different part of the app?
0
0
385
Sep ’23
Combine Master-Detail View and Tab View in iPad
Hello, I want to create a UI in which there are 4 main tabs representing individual views/screen (Just like the one in AppStore app). Now for some of the screens, I want to show the content of it using Master-Detail view - Just like iPad Messaging app where message list is in the master view and chatting is in the detail view. The TabView must remain visible to the users to navigate through all 4 views/screens. To show both, TabView and Master-Detail view, in one screen, I get to see 2 options. Show the TabView in MasterView section. In my opinion, this option is fundamentally a malpractice in perspective of UX. Because TabView is representation of shortcut of all 4 screens and user will use them to navigate through different screens, we must not restrict TabView in any other view. TabView must be placed at the top most hierarchy of the application. Keep the TabView in the top-most hierarchy and show in full width like it is shown in the AppStore app, and when user taps of any of the tab, the view that appears would have the Master-Detail View. Now in this one, I have concern of me manipulating the concept of Layout designs and worse UX. I am looking for the right way to implement such functionality with a good and UI/UX. Thank you.
0
0
451
Oct ’23
How to Change Picker Text Color In SwiftUI
I try to change picker text color but, it does not work. As you see, "City" and "District"'s color are blue but, I'd like to make them white. I have tried below codes but, they do not work. Do you know any methods for that ? Picker("İl", selection: $selectedCity) { ForEach(turkishCities, id: \.self) { city in Text(city) .foregroundColor(.white) } } Picker("İlçe", selection: $selectedDistrict) { ForEach(cityDistricts[selectedCity] ?? [], id: \.self) { district in Text(district) .foregroundColor(Color.white) } } .onAppear { UISegmentedControl.appearance().setTitleTextAttributes([.foregroundColor: UIColor.white], for: .normal) } Thank you in advance.
2
0
3.8k
Feb ’24
Handling Orders from my new App
I am a bit new to app development, spent the last month or so doing an app that handles orders and I integrated the use of firebase as well as notification and apple pay. Now once the payment is done from the app, how do i know what the order is and where do i receive the money, Do i need to create mote handling for that or does it automatically come from apply pay ? Any pointers on this would be very helpful
0
0
506
Oct ’23
Full Screen Cover and iPhone Orientation
Currently, there seems to be an all or nothing approach to supporting rotation on iPhone. Either every screen in your UI supports rotation, or none of them do. For a some apps however, that approach won't work. They have a number of screens that don't adapt well to a super letterboxed screen size, and a number of others that would benefit from the additional screen space. Previous discussion on this issue recommends the use of size classes, but this advice fails to recognise that some use cases simply aren't suited to being super letterboxed. Apple's own UI design is tacit acknowledgement of this: For example, the main UI of the Camera app stays fixed in the portrait orientation in the shooting mode, but presents a rotatable modal to review photos and videos. Even Springboard, the home screen of the iPhone, remains locked in the portrait orientation whilst allowing an app to be presented in landscape. Social media and news apps are another example: generally anchored around a portrait newsfeed that doesn't adapt well to extreme letterboxing, but surfacing rich media such as images, videos, charts and other interactive elements that could use the flexibility of landscape presentation. (News app, looking at you.) Is it time to re-visit the rotation characteristics of the phone vs. tablet idioms? Is this all-or-nothing approach to rotation serving the platform well? Regardless, app designers at Apple and elsewhere are creating apps that use this hybrid approach to rotation. And as things stand today, SwiftUI makes it very difficult. A rough equivalent can be made using a ZStack and observing the device orientation, but this requires hiding the status bar and provides no way to honor a user's portrait lock settings. The only other option, as far as I can tell, is building the app using UIKit view controllers, to thread through supportedInterfaceOrientations hooks. Personally, what I'd love to see is a new presentationInterfaceOrientations(_:) hook on View, that allows a fullScreenCover presentation to be specified as supporting an alternative orientation set. This could be iPhone only, and should serve the majority of use cases. However, in the meantime, it would be great to know if there's a technique that can get the UIKit behavior in a SwiftUI app that doesn't require rewriting the entire container view hierachy in UIKit.
0
1
643
Oct ’23
UICollectionView Compositional Layout Tag Group
I’m trying to create a layout with a group of labels / tags. The labels have a flexible width and height. If a label exceeds the width of the container it should grow in height. I’m using a UICollectionView with a compositional layout to create this layout. At first I used estimated for the width and height dimension of the layout items within a horizontal group layout that had an fractionalWidth and an estimated height. This worked but only if the cells with the labels were smaller than the group width. If they are larger, the app crashes. Somewhere on StackOverflow I read that this is a known issue. To fix the issue above I made the main group a vertical layout and created a different group for every row of labels. If the labels width exceeds the width of the group I give if a fractional width and if it’s smaller I give it an estimated width. This approach prevents the crashed above and gives me my desired layout. But… as soon as I rotate the device of call invalidate on the collection view layout; the layout is messed up. It looks like very cell gets the width of the value I proved in the estimated width dimension. Can someone help me to fix this issue? My app needs to run on iOS 14 and above. I've uploaded a small demo app to my GitHub that contains my current setup: https://github.com/JeroenVanRijn/compositional-layout This is the code I use for the UICollectionViewCompositionalLayout: func createLayout() -> UICollectionViewLayout { let layout = UICollectionViewCompositionalLayout { (sectionIndex: Int, layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection in var groups = [NSCollectionLayoutGroup]() let contentSize = layoutEnvironment.container.effectiveContentSize var rows = [[CGFloat]]() var currentRow = [CGFloat]() var currentRowWidth: CGFloat = 0 let spacing: CGFloat = 10 let maxRowWidth = contentSize.width - (2 * spacing) // Loop through the labels and add them to rows. for label in self.dataSource.snapshot(for: .main).items { let textWidth = self.width(for: label.text) let cellWidth = textWidth + 16 if currentRowWidth > 0 { currentRowWidth += spacing // spacing } currentRowWidth += cellWidth currentRow.append(cellWidth) if currentRowWidth > maxRowWidth { let last = currentRow.last! let withoutLast = Array(currentRow.dropLast()) addRow(items: withoutLast) currentRow = [last] currentRowWidth = last } } // Remaining rows if !currentRow.isEmpty { addRow(items: currentRow) } func addRow(items: [CGFloat]) { rows.append(items) // If a row contains only item that is larger that the group with we give it the width of the group. if items.count == 1 && items[0] >= maxRowWidth { print("Add row: \(items.count) - FULL WIDTH") let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(44)) let layoutItem = NSCollectionLayoutItem(layoutSize: itemSize) let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(44)) let innerGroup = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [layoutItem]) innerGroup.interItemSpacing = .fixed(spacing) groups.append(innerGroup) } else { print("Add row: \(items.count)") let itemSize = NSCollectionLayoutSize(widthDimension: .estimated(44), heightDimension: .estimated(44)) let layoutItem = NSCollectionLayoutItem(layoutSize: itemSize) let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(44)) let innerGroup = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [layoutItem]) innerGroup.interItemSpacing = .fixed(spacing) groups.append(innerGroup) } } print("Number of groups: \(groups.count)") let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(44)) let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitems: groups) group.interItemSpacing = .fixed(spacing) let section = NSCollectionLayoutSection(group: group) section.interGroupSpacing = spacing section.contentInsets = NSDirectionalEdgeInsets(top: 10, leading: 10, bottom: 10, trailing: 10) return section } return layout } func width(for text: String) -> CGFloat { text.size(withAttributes:[.font: UIFont.systemFont(ofSize: 16)]).width }
0
0
662
Oct ’23
Our app rejected by Guideline 4.3 - Design Please Help!
Hello, Our app rejected by following reason: Guideline 4.3 - Design We noticed your app shares a similar binary, metadata, and/or concept as apps previously submitted by a terminated Apple Developer Program account. Submitting similar or repackaged apps is a form of spam that creates clutter and makes it difficult for users to discover new apps. Next Steps Since we do not accept spam apps on the App Store, we encourage you to review your app concept and submit a unique app with distinct content and functionality. Resources Some factors that contribute to a spam rejection may include: Submitting an app with the same source code or assets as other apps already submitted to the App Store Creating and submitting multiple similar apps using a repackaged app template Purchasing an app template with problematic code from a third party Submitting several similar apps across multiple accounts Learn more about our requirements to prevent spam in App Store Review Guideline 4.3. iOS App 1.0App Version Rejection Reasons: 4.3.0 Design: Spam The application is 100% developed by our team and I am 100% sure of it. How can we do it ? Please help.
5
0
1.4k
Nov ’23
Question about coding style guide at Apple with continue and break keywords
Hi there! I recently got into a discussion with my Java professor. In her style guide she specifically mentions to never use the break or continue keywords in loops as they are, according to her, outdated and unviable. I have tried to prove by counter example when they are more useful than alternatives, without success. This has gotten me wondering if these keywords are actually outdated, I am still a student after all. So I wanted to know from someone at Apple if using break or continue is forbidden, discouraged or fine to use (specifically in java but general guidelines are also fine) and why? Any answer from a current or former Apple employee would help me greatly to have an insight into how the industry handles these keywords and I thank you in advance for your response. If there is a better place to ask this please direct me towards that.
5
1
424
Nov ’23
SwiftUI: Sheet Modal, unexpected resize behavior
Hey Everyone, I've been remaking an app using SwiftUI, and I am running into a weird animation bug/hitch using .sheet(isPresented:). I have a GIF illustrating the issue, but can't seem to attach it to this forum post. Let me know if there's anyway to share this. Link to gif detailing issue(self hosted) Regardless, my issue: To describe the issue: I'm using two Detents for the sheet, [.medium, .large]. I have a TextField that's displayed in the sheet, and when opening it, the keyboard moves my content upward (expected, working fine). My issue comes when I programmatically resign the TextField (using .focused($isFocused). The content on the sheet jumps up, beyond the upper bound of the sheet. My hypothesis is that the sheet's content is immediately redrawn, using the medium detent frame, but before the animation has finished going from large to medium. It's possible this is not a SwiftUI bug, but something wrong with my implementation. I'll provide the relevant code below. Any help is greatly appreciated! Onboarding.swift (presents the sheet) @ViewBuilder var content: some View { VStack { headline .foregroundStyle(.white.opacity(0.95)) subHeadline .foregroundStyle(.white) Spacer() messages .foregroundStyle(.white) Spacer() callToAction } .ignoresSafeArea(.keyboard) .sheet(isPresented: $showJoin) { join } } var join: some View { Join() .ignoresSafeArea() .presentationCornerRadius(40) .presentationDragIndicator(.hidden) .presentationBackground { Rectangle() .fill(.ultraThinMaterial) .padding(.bottom, -1000) } .presentationDetents([.medium, .large]) } Join.swift (holds the sheet's content, and displays the heading) struct Join: View { @State private var didSignUp = false var body: some View { VStack { heading Divider() contentView } .animation(.easeInOut, value: didSignUp) .transition(.opacity) .interactiveDismissDisabled(didSignUp) } var heading: some View { VStack(spacing: 8) { Text(didSignUp ? "Verify" : "Start here") .frame(maxWidth : .infinity, alignment: .leading) .font(.largeTitle.bold()) .foregroundColor(.primary) .blendMode(.overlay) Text(didSignUp ? "Enter code" : "Create an account") .frame(maxWidth : .infinity, alignment: .leading) .font(.callout) .foregroundColor(.primary) .blendMode(.overlay) } .padding(.top, 20) .padding(.horizontal) } var contentView: some View { Group { if didSignUp { Verification() .transition(.move(edge: .trailing).combined(with: .opacity)) } else { SignUp(didSignUp: $didSignUp) .transition(.move(edge: .leading).combined(with: .opacity)) } } .padding(.horizontal) } } SignUp.swift (the sheet content) struct SignUp: View { @Binding var didSignUp: Bool @State private var phoneNumber: String = "" @State private var sendingTextMessage = false @FocusState private var isFocused: Bool private let notice = """ By creating an account, you agree to our **[Terms of Service](https://cordia.app/tos)** and **[Privacy Policy](https://cordia.app/privacy)** """ var body: some View { VStack { VStack { phoneNumberLabel phoneNumberInput } .padding() if sendingTextMessage { LoadingIndicator(isVisible: $sendingTextMessage) .padding() } else { continueButton .padding() } Spacer() termsAndConditions .padding(.bottom) } } var phoneNumberLabel: some View { Text("Enter your phone number") .font(.title3) .foregroundColor(.primary) .blendMode(.overlay) .frame(maxWidth: .infinity, alignment: .leading) } var phoneNumberInput: some View { iPhoneNumberField("(***) 867-5309", text: $phoneNumber) .maximumDigits(10) .formatted() .clearsOnEditingBegan(true) .clearButtonMode(.always) .font(.system(size: 25, weight: .semibold)) .padding() .glass(cornerRadius: 10) .focused($isFocused) } var termsAndConditions: some View { Text(addPolicyLinks() ?? AttributedString(notice)) .multilineTextAlignment(.center) .fixedSize(horizontal: false, vertical: true) .font(.body) .blendMode(.overlay) .padding() } var continueButton: some View { Button(action: { guard !sendingTextMessage else { return } sendingTextMessage = true isFocused = false UIImpactFeedbackGenerator(style: .rigid).impactOccurred() Auth.signUp(with: phoneNumber) { user, error in didSignUp = true } }) { Text("Join Cordia") .font(.system(size: 25, weight: .semibold)) .foregroundColor(.primary.opacity(0.8)) .frame(width: 200, height: 60) .tintedGlass( cornerRadius: 20, strokeColor: .cordiaGoldDark, strokeSize: 1.0, tint: .cordiaGold ) } } private func addPolicyLinks() -> AttributedString? { var string = try? AttributedString(markdown: notice) if let range = string?.range(of: "Terms of Service") { string?[range].foregroundColor = .cordiaGold } if let range = string?.range(of: "Privacy Policy") { string?[range].foregroundColor = .cordiaGold } return string } }
4
0
1.4k
Jan ’24