【发布时间】:2021-09-14 10:10:02
【问题描述】:
我尝试使用从 UIKit 创建的自定义视图按钮到使用 UIViewRepresentable 的 SwiftUI 视图,但它没有按预期工作。
预期:
点击或按住视图按钮会缩小。
实际:
最初点击时视图按钮会展开,然后松开时会缩小
自定义视图按钮在 UIKit 控制器中正常工作。
在 UIKit 中创建的自定义按钮视图
public class CustomButton: UIView {
fileprivate var clickedBtn: (() -> Void)?
.
.
.
.
public func addAction(withEvent event: UIControl.Event = .touchUpInside, handler clickedHandler: @escaping () -> Void) {
button.addTarget(self, action: #selector(holdRelease(_:)), for: .touchUpInside)
button.addTarget(self, action: #selector(holdDown(_:)), for: .touchDown)
button.addTarget(self, action: #selector(holdRelease(_:)), for: .touchDragExit)
}
clickedBtn = clickedHandler
}
@objc public func holdDown(_ sender: CXButton) {
setupUIforHoldDown()
}
@objc public func holdRelease(_ sender: CXButton) {
setupUIForHoldRelease()
clickedBtn?()
}
.
.
.
.
/// Button rescales when touchDown. Button resizes back to 100% once release.
private func setupUIforHoldDown() {
rescaleButtonSize(scaleXto: 0.95, scaleYto: 0.95)
}
private func setupUIForHoldRelease() {
rescaleButtonSize()
}
private func rescaleButtonSize(scaleXto x: CGFloat = 1.0,scaleYto y: CGFloat = 1.0) {
DispatchQueue.main.async {
UIView.animate(withDuration: 0.2, animations: {
self.transform = CGAffineTransform(scaleX: x, y: y)
})
}
}
}
UIViewRepresentable
import SwiftUI
struct SwiftUI_CustomButton: UIViewRepresentable {
var title: String
var handler: (() -> Void)? = nil
func makeUIView(context: Context) -> CustomButton {
let button = CustomButton()
updateUIView(button, context: context)
button.addAction {
self.handler?()
}
return button
}
func updateUIView(_ button: CustomButton, context: Context) {
button.title = title
}
}
Swift UI 视图
struct CustomButton_SwiftUI: View {
var body: some View {
VStack(alignment: .leading, spacing: 8) {
SwiftUI_CustomButton(
title: "Actual"
) {
// Button Action
}
}
.padding(16)
}
}
编辑:我仍在使用 UIKit 自定义视图,因为它也用于某些 UIKit 控制器。
【问题讨论】:
标签: ios swiftui cgaffinetransform custom-view uiviewrepresentable