要在 SwiftUI 中设置按钮样式,根据我的理解,您需要扩展ButtonStyle和实现,func makeBody(configuration: Self.Configuration) -> some View在其中开始configuration.label对Button视图的引用应用修改。
现在,除了label字段之外,ButtonStyle.Configuration还有一个布尔字段 for isPressed,但这似乎就是全部。
如何检查按钮是启用还是禁用?
例如,我想在按钮周围绘制一个边框,如果按钮启用,我希望边框为蓝色,如果禁用,则边框为灰色。
我的第一个猜测是这样的:
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
.overlay(
RoundedRectangle(cornerRadius: 4).stroke(configuration.isEnabled ? Color.blue : Color.gray, lineWidth: 1).padding(8)
)
}
Run Code Online (Sandbox Code Playgroud)
但是没有isEnabled领域。
Apple 提供的PlainButtonStyle显然可以访问这些信息,因为头文件中的 doc 注释声明它说“样式可以应用视觉效果来指示按钮的按下、聚焦或启用状态”。
/// A `Button` style that does not style or decorate its content while idle.
///
/// The style may apply a visual effect to indicate …Run Code Online (Sandbox Code Playgroud) 我有一个列表视图,列表的每一行都包含一个带有某些文本视图和图像的HStack,如下所示:
HStack{
Text(group.name)
Spacer()
if (groupModel.required) { Text("Required").color(Color.gray) }
Image("ic_collapse").renderingMode(.template).rotationEffect(Angle(degrees: 90)).foregroundColor(Color.gray)
}.tapAction { self.groupSelected(self.group) }
Run Code Online (Sandbox Code Playgroud)
这似乎很好用,除了当我在文本和图像之间的空白区域(Spacer()是)轻拍时,tap动作未注册。仅当我在文本或图像上点击时,才会发生点击动作。
其他人是否遇到过此问题/知道解决方法?
我想在按下按钮时更改图像名称。
到目前为止,这是我的结构:
struct ContentView: View {
@State var matrix = [Int] var
body: some View {
VStack {
Text("Test")
HStack(alignment: .center, spacing: 8) {
Button(action: {
**
// call a func that will do some check and
// change the image from Blue.png to Red.png
**
}) {
Image("Blue")
.renderingMode(.original)
.resizable()
.aspectRatio(contentMode: .fill)
.clipShape(Circle())
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想在开始按下按钮时执行一个操作,然后在停止按下按钮时执行一个操作。我一直在寻找一个简单的解决方案,但遇到了更复杂的配置。我从BlueSpud获得的一个选项非常简单且接近。按钮操作未使用,所以我尝试:
struct MyView: View {
@State private var pressing = false
var body: some View {
Text("Button")
.background(self.pressing ? Color.red : Color.blue)
.gesture(DragGesture(minimumDistance: 0.0)
.onChanged { _ in
self.pressing = true
print("Pressing started and/or ongoing")
}
.onEnded { _ in
self.pressing = false
print("Pressing ended")
})
}
}
Run Code Online (Sandbox Code Playgroud)
此代码的问题在于,如果您在按下时将手指拖出按钮区域,则 .onEnded 永远不会被调用,并且如果没有可靠的事件结束,该解决方案将不起作用。
我还尝试过 Apple 的编写 SwiftUI 手势的示例。它提供了对按下和未按下状态的非常一致的控制,但我似乎不知道在哪里插入我的动作:
struct PressedButton: View {
var startAction: ()->Void
var endAction: ()->Void
enum DragState {
case inactive
case pressing
case dragging(translation: CGSize) …Run Code Online (Sandbox Code Playgroud) 我如何在列表行上制作自定义叠加层,以便在点击时突出显示它。我正在使用NaviagationLink并且我已经改变了
UITableViewCell.appearance().cellSelectionStyle = .none
Run Code Online (Sandbox Code Playgroud)
为了不使用默认的灰色选择。
我试图向@State isSelected我的 Cell添加一些,但我不知道如何/何时更改它以获得这种影响。我试图添加,onTapGesture()但它阻止了 NavigationLink,并且不提供开始、结束状态,刚刚结束。