如何自定义 STPPaymentCardTextField.Representable
How to customize STPPaymentCardTextField.Representable
我已经使用以下方法成功创建了支付卡文本字段:
STPPaymentCardTextField.Representable(paymentMethodParams: $paymentMethodParams)
不过,我想去掉边框。
使用以下方法添加边框似乎只是在默认边框上添加了另一个边框。
STPPaymentCardTextField.Representable(paymentMethodParams: $paymentMethodParams)
.border(Color.red, width: 1)
我也试过将宽度更改为 0,但边框没有消失。
感谢任何帮助! :)
基本上,您可以重复使用 Stripe
提供的 SwiftUI
代码和 add/remove 您自己的 color/customizations 代码。以下将生成没有 border
颜色的 STPPaymentCardTextField
。
我们所要做的就是在 makeUIView(context:)
方法中添加 paymentCardField.borderColor = nil
。
/// A SwiftUI representation of an STPPaymentCardTextField.
public struct RepresentableField: UIViewRepresentable {
@Binding var paymentMethodParams: STPPaymentMethodParams?
/// Initialize a SwiftUI representation of an STPPaymentCardTextField.
/// - Parameter paymentMethodParams: A binding to the payment card text field's contents.
/// The STPPaymentMethodParams will be `nil` if the payment card text field's contents are invalid.
public init(paymentMethodParams: Binding<STPPaymentMethodParams?>) {
_paymentMethodParams = paymentMethodParams
}
public func makeCoordinator() -> Coordinator {
return Coordinator(parent: self)
}
public func makeUIView(context: Context) -> STPPaymentCardTextField {
let paymentCardField = STPPaymentCardTextField()
paymentCardField.borderColor = nil // set this to nil if you don't want a border color
if let cardParams = paymentMethodParams?.card {
paymentCardField.cardParams = cardParams
}
if let postalCode = paymentMethodParams?.billingDetails?.address?.postalCode {
paymentCardField.postalCode = postalCode
}
if let countryCode = paymentMethodParams?.billingDetails?.address?.country {
paymentCardField.countryCode = countryCode
}
paymentCardField.delegate = context.coordinator
paymentCardField.setContentHuggingPriority(.required, for: .vertical)
return paymentCardField
}
public func updateUIView(_ paymentCardField: STPPaymentCardTextField, context: Context) {
if let cardParams = paymentMethodParams?.card {
paymentCardField.cardParams = cardParams
}
if let postalCode = paymentMethodParams?.billingDetails?.address?.postalCode {
paymentCardField.postalCode = postalCode
}
if let countryCode = paymentMethodParams?.billingDetails?.address?.country {
paymentCardField.countryCode = countryCode
}
}
public class Coordinator: NSObject, STPPaymentCardTextFieldDelegate {
var parent: RepresentableField
init(parent: RepresentableField) {
self.parent = parent
}
public func paymentCardTextFieldDidChange(_ cardField: STPPaymentCardTextField) {
let paymentMethodParams = STPPaymentMethodParams(
card: cardField.cardParams, billingDetails: nil, metadata: nil)
if !cardField.isValid {
parent.paymentMethodParams = nil
return
}
if let postalCode = cardField.postalCode, let countryCode = cardField.countryCode {
let billingDetails = STPPaymentMethodBillingDetails()
let address = STPPaymentMethodAddress()
address.postalCode = postalCode
address.country = countryCode
billingDetails.address = address
paymentMethodParams.billingDetails = billingDetails
}
parent.paymentMethodParams = paymentMethodParams
}
}
}
我已经使用以下方法成功创建了支付卡文本字段:
STPPaymentCardTextField.Representable(paymentMethodParams: $paymentMethodParams)
不过,我想去掉边框。
使用以下方法添加边框似乎只是在默认边框上添加了另一个边框。
STPPaymentCardTextField.Representable(paymentMethodParams: $paymentMethodParams)
.border(Color.red, width: 1)
我也试过将宽度更改为 0,但边框没有消失。
感谢任何帮助! :)
基本上,您可以重复使用 Stripe
提供的 SwiftUI
代码和 add/remove 您自己的 color/customizations 代码。以下将生成没有 border
颜色的 STPPaymentCardTextField
。
我们所要做的就是在 makeUIView(context:)
方法中添加 paymentCardField.borderColor = nil
。
/// A SwiftUI representation of an STPPaymentCardTextField.
public struct RepresentableField: UIViewRepresentable {
@Binding var paymentMethodParams: STPPaymentMethodParams?
/// Initialize a SwiftUI representation of an STPPaymentCardTextField.
/// - Parameter paymentMethodParams: A binding to the payment card text field's contents.
/// The STPPaymentMethodParams will be `nil` if the payment card text field's contents are invalid.
public init(paymentMethodParams: Binding<STPPaymentMethodParams?>) {
_paymentMethodParams = paymentMethodParams
}
public func makeCoordinator() -> Coordinator {
return Coordinator(parent: self)
}
public func makeUIView(context: Context) -> STPPaymentCardTextField {
let paymentCardField = STPPaymentCardTextField()
paymentCardField.borderColor = nil // set this to nil if you don't want a border color
if let cardParams = paymentMethodParams?.card {
paymentCardField.cardParams = cardParams
}
if let postalCode = paymentMethodParams?.billingDetails?.address?.postalCode {
paymentCardField.postalCode = postalCode
}
if let countryCode = paymentMethodParams?.billingDetails?.address?.country {
paymentCardField.countryCode = countryCode
}
paymentCardField.delegate = context.coordinator
paymentCardField.setContentHuggingPriority(.required, for: .vertical)
return paymentCardField
}
public func updateUIView(_ paymentCardField: STPPaymentCardTextField, context: Context) {
if let cardParams = paymentMethodParams?.card {
paymentCardField.cardParams = cardParams
}
if let postalCode = paymentMethodParams?.billingDetails?.address?.postalCode {
paymentCardField.postalCode = postalCode
}
if let countryCode = paymentMethodParams?.billingDetails?.address?.country {
paymentCardField.countryCode = countryCode
}
}
public class Coordinator: NSObject, STPPaymentCardTextFieldDelegate {
var parent: RepresentableField
init(parent: RepresentableField) {
self.parent = parent
}
public func paymentCardTextFieldDidChange(_ cardField: STPPaymentCardTextField) {
let paymentMethodParams = STPPaymentMethodParams(
card: cardField.cardParams, billingDetails: nil, metadata: nil)
if !cardField.isValid {
parent.paymentMethodParams = nil
return
}
if let postalCode = cardField.postalCode, let countryCode = cardField.countryCode {
let billingDetails = STPPaymentMethodBillingDetails()
let address = STPPaymentMethodAddress()
address.postalCode = postalCode
address.country = countryCode
billingDetails.address = address
paymentMethodParams.billingDetails = billingDetails
}
parent.paymentMethodParams = paymentMethodParams
}
}
}