Hello Apple Team,
I’ve encountered a regression in iOS 26.1 when building my app with Xcode 26 (iOS 26 SDK). The issue affects PKPaymentButtonType.plain, which now renders as fully invisible and produces transparent snapshots, even though the same code worked correctly in previous Xcode/iOS versions.
This has a real-world impact because many apps generate static images from PKPaymentButton for payment selection UIs using UIGraphicsImageRenderer, layer.render(in:), or custom snapshot utilities.
When using PKPaymentButton(paymentButtonType: .plain, paymentButtonStyle: .black) on iOS 26.1, when built with Xcode 26, the button:
- Appears blank / invisible
- Cannot be snapshotted
- Produces a fully transparent UIImage, even though the CGImage object exists
- Behaves differently than older SDKs (Xcode 16.x / iOS < 26.1
This regression only appears when compiling with the new SDK.
Other button types work fine. Expected Behavior
- .plain button should render glyphs as documented
- snapshot generated via UIGraphicsImageRenderer or drawHierarchy(in:) should produce a visible image
- Behavior should be consistent with older SDKs unless explicitly deprecated in release notes
Expected Behavior
- .plain button should render glyphs as documented
- Snapshot generated via UIGraphicsImageRenderer or drawHierarchy(in:) should produce a visible image
- Behavior should be consistent with older SDKs unless explicitly deprecated in release notes
Actual Behavior
- .plain button renders no glyph at all
- Snapshot image is fully transparent (alpha = 0), even though size and CGImage metadata are correct
- Only happens when built with Xcode 26 SDK
- Same build from Xcode 16.x does not reproduce the issue
Steps to Reproduce
- Create a minimal sample project in Xcode 26
- Add the following code:
let button = PKPaymentButton(paymentButtonType: .plain, paymentButtonStyle: .black)
button.frame = CGRect(x: 0, y: 0, width: 180, height: 48)
let renderer = UIGraphicsImageRenderer(size: button.bounds.size)
let image = renderer.image { _ in
button.drawHierarchy(in: button.bounds, afterScreenUpdates: true)
}
print(image)
- Run on iOS 26.1 device or simulator
- Observe that: The button appears visually empty The generated image is fully transparent
Environment
- Xcode: 26.x (iOS 26 SDK)
- iOS: 26.1 (iPhone 15 Pro tested)
- Device: Real device
- Framework: UIKit + PassKit
- Button type: .plain ONLY
- Other types: .pay/.buy/.checkout = OK