切换ASAuthorizationAppleIDButton样式并适应暗/亮模式

6

我有一个苹果登录按钮,它在浅色模式下的样式是 .black

let button = ASAuthorizationAppleIDButton(type: .signIn, style: .black)

我希望它在深色模式下有 .white 样式。

像这样访问样式并进行更改似乎不可能:

button.style = .white

有人知道是否可以以简洁的方式实现此操作吗?不必在每次更改按钮样式时重新创建按钮

traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {

检测模式变化?

2
似乎你需要创建一个新的按钮实例。根据你的用户界面,白色轮廓样式可以在浅色和暗色中都起作用。 - Paulw11
1个回答

2
据我所知,一旦实例化了ASAuthorizationAppleIDButton,就无法更改其style。最终的解决方案是在初始化时实例化两个按钮,并根据当前的traitCollection仅显示所需的一个。还有其他解决方案,但这个解决方案确保总共只需要两个实例。
这两个按钮保存在堆栈视图中:
let blackButton = ASAuthorizationAppleIDButton(type: .signIn, style: .black)
let whiteButton = ASAuthorizationAppleIDButton(type: .signIn, style: .black)

private lazy var stackView = {
    let stackView = UIStackView(arrangedSubviews: [blackButton, whiteButton])
    stackView.axis = .vertical
    return stackView
}()

可以将stackView定位在UI中放置常规按钮的位置。

监听特征集合更改并隐藏/显示所需的按钮:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        let currentInterface = UITraitCollection.current
        // Only do a change when the style interface really changed
        guard previousTraitCollection?.userInterfaceStyle != currentInterface.userInterfaceStyle else {
            return
        }

        // Hide or show buttons depending on your design.
        if currentInterface.userInterfaceStyle == .dark {
            blackButton.isHidden = true
            whiteButton.isHidden = false
        } else {
            blackButton.isHidden = false
            whiteButton.isHidden = true
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接