Post

Replies

Boosts

Views

Activity

App Stuck in “Waiting for Review” for 11+ Days – ShopBack: Cashback & Rewards(1086505626)
Dear App Review Team, We are ShopBack mobile team. We submitted v6.12.0 on May 21 and it's been in "Waiting for Review" fo 4+ days. This is our second consecutive blocked release as v6.11.0 was rejected May 14 and never completed review, so our iOS users haven't received an update in 11 days. Here's what's sitting in this v6.12.0 build that's directly hurting users right now: Users who've had cashback claims rejected have no idea why. This release finally shows them the rejection reason. It's a financial app and our users deserve to know why their money wasn't credited. Users are hitting an intermittent crash during login due to a main-thread issue. This build fixes it. Users across 8 markets can't withdraw their cashback to airline miles. The feature is built and ready, just blocked. We've resolved all issues from the v6.11.0 rejection and are confident this submission is fully compliant. We're available to address any concerns immediately. Thank you for your time. Bundle ID: com.shopback.ShopBack | Apple ID: 1086505626 | Version: 6.12.0 (6120004) ShopBack Mobile Team
0
0
147
May ’26
Why does NSLayoutManager's text height/lines calculation differ from UILabel's behavior with different line break modes?
We are curious about what caused the mismatch between UILabel rendering and NSLayoutManager calculation with different lineBreakMode. Can we say that NSLayoutManager doesn't support lineBreakMode except .byWordWrapping? First, we have a function that creates an attributed string. In this function, we assign .byTruncatingTail to the paragraphStyle lineBreakMode. func createAttributedString(with text: String) -> NSMutableAttributedString { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineBreakMode = .byTruncatingTail let attributedString = NSMutableAttributedString(string: text, attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 35), NSAttributedString.Key.paragraphStyle: paragraphStyle]) return attributedString } If we create a label with the following settings: let text = (1..<20).reduce("", { "\($0)" + "\($1)-"}) let attributedString = createAttributedString(with: text) let label = UILabel(frame: CGRect(origin: .zero, size: CGSize(width: 100, height: 500))) label.numberOfLines = 0 label.lineBreakMode = .byTruncatingTail label.attributedText = attributedString we get the result: If we use the same attributed string maker function and use NSLayoutManager to calculate the height for a certain width with the following code reference from Apple's documentation: let text = (1..<20).reduce("", { "\($0)" + "\($1)-"}) let attributedString = createAttributedString(with: text) let textContainer = NSTextContainer(size: CGSize(width: 100, height: CGFloat.greatestFiniteMagnitude)) let layoutManager = NSLayoutManager() let textStorage = NSTextStorage(attributedString: attributedString) layoutManager.addTextContainer(textContainer) textStorage.addLayoutManager(layoutManager) textContainer.lineFragmentPadding = 0.0 textContainer.maximumNumberOfLines = 0 textContainer.lineBreakMode = .byTruncatingTail layoutManager.ensureLayout(for: textContainer) layoutManager.glyphRange(for: textContainer) let textFrame = layoutManager.usedRect(for: textContainer) print("textSize: \(textFrame.size)") we get the print result: If we assign the calculated rect to the label, we get: This result does not match the initial label we created. If we change the lineBreakMode in the attributed string maker to the default value, .byWordWrapping, we can get the result for multiple lines, which has the same height as the initial label. If we assign the calculated rect to the label, we get: We are curious about what caused the mismatch between UILabel rendering and NSLayoutManager calculation with different lineBreakMode. Can we say that NSLayoutManager doesn't support lineBreakMode except .byWordWrapping? We are also curious about the design thought behind having the default lineBreakMode for UILabel be .byTruncatingTail and for NSMutableParagraphStyle be .byWordWrapping.
0
0
1.5k
May ’23
App Stuck in “Waiting for Review” for 11+ Days – ShopBack: Cashback & Rewards(1086505626)
Dear App Review Team, We are ShopBack mobile team. We submitted v6.12.0 on May 21 and it's been in "Waiting for Review" fo 4+ days. This is our second consecutive blocked release as v6.11.0 was rejected May 14 and never completed review, so our iOS users haven't received an update in 11 days. Here's what's sitting in this v6.12.0 build that's directly hurting users right now: Users who've had cashback claims rejected have no idea why. This release finally shows them the rejection reason. It's a financial app and our users deserve to know why their money wasn't credited. Users are hitting an intermittent crash during login due to a main-thread issue. This build fixes it. Users across 8 markets can't withdraw their cashback to airline miles. The feature is built and ready, just blocked. We've resolved all issues from the v6.11.0 rejection and are confident this submission is fully compliant. We're available to address any concerns immediately. Thank you for your time. Bundle ID: com.shopback.ShopBack | Apple ID: 1086505626 | Version: 6.12.0 (6120004) ShopBack Mobile Team
Replies
0
Boosts
0
Views
147
Activity
May ’26
Why does NSLayoutManager's text height/lines calculation differ from UILabel's behavior with different line break modes?
We are curious about what caused the mismatch between UILabel rendering and NSLayoutManager calculation with different lineBreakMode. Can we say that NSLayoutManager doesn't support lineBreakMode except .byWordWrapping? First, we have a function that creates an attributed string. In this function, we assign .byTruncatingTail to the paragraphStyle lineBreakMode. func createAttributedString(with text: String) -> NSMutableAttributedString { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineBreakMode = .byTruncatingTail let attributedString = NSMutableAttributedString(string: text, attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 35), NSAttributedString.Key.paragraphStyle: paragraphStyle]) return attributedString } If we create a label with the following settings: let text = (1..<20).reduce("", { "\($0)" + "\($1)-"}) let attributedString = createAttributedString(with: text) let label = UILabel(frame: CGRect(origin: .zero, size: CGSize(width: 100, height: 500))) label.numberOfLines = 0 label.lineBreakMode = .byTruncatingTail label.attributedText = attributedString we get the result: If we use the same attributed string maker function and use NSLayoutManager to calculate the height for a certain width with the following code reference from Apple's documentation: let text = (1..<20).reduce("", { "\($0)" + "\($1)-"}) let attributedString = createAttributedString(with: text) let textContainer = NSTextContainer(size: CGSize(width: 100, height: CGFloat.greatestFiniteMagnitude)) let layoutManager = NSLayoutManager() let textStorage = NSTextStorage(attributedString: attributedString) layoutManager.addTextContainer(textContainer) textStorage.addLayoutManager(layoutManager) textContainer.lineFragmentPadding = 0.0 textContainer.maximumNumberOfLines = 0 textContainer.lineBreakMode = .byTruncatingTail layoutManager.ensureLayout(for: textContainer) layoutManager.glyphRange(for: textContainer) let textFrame = layoutManager.usedRect(for: textContainer) print("textSize: \(textFrame.size)") we get the print result: If we assign the calculated rect to the label, we get: This result does not match the initial label we created. If we change the lineBreakMode in the attributed string maker to the default value, .byWordWrapping, we can get the result for multiple lines, which has the same height as the initial label. If we assign the calculated rect to the label, we get: We are curious about what caused the mismatch between UILabel rendering and NSLayoutManager calculation with different lineBreakMode. Can we say that NSLayoutManager doesn't support lineBreakMode except .byWordWrapping? We are also curious about the design thought behind having the default lineBreakMode for UILabel be .byTruncatingTail and for NSMutableParagraphStyle be .byWordWrapping.
Replies
0
Boosts
0
Views
1.5k
Activity
May ’23