PKPaymentButtonType.plain renders blank on iOS 26.1 when built with Xcode 26 (snapshot returns transparent image)

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

Hi, thanks for getting in touch.

We've never stated that PKPaymentButton is a supported view when using UIGraphicsImageRenderer, and the change to the default behaviour in iOS 26 is intended. I'd be interested to know why PKPaymentButton is being snapshotted in this way, rather than being used directly?

To revert to the previous behaviour for the button, you can initialise it using the new convenience initializer. Setting disableCardArt to true will ensure the button behaves the way it did in previous versions of iOS.

If the button (when inserted into the view hierarchy as is) is still rendering blank, then this would require further investigation. If so, please file a bug report, as described in https://developer.apple.com/bug-reporting/.

I can verify that the use of the new convenience initializer fixed the issue in our snapshot tests.

PKPaymentButtonType.plain renders blank on iOS 26.1 when built with Xcode 26 (snapshot returns transparent image)
 
 
Q