SwiftUI 条件 .frame 视图修饰符

Posted

技术标签:

【中文标题】SwiftUI 条件 .frame 视图修饰符【英文标题】:SwiftUI Conditional .frame View Modifier 【发布时间】:2021-04-01 18:53:53 【问题描述】:

我的代码如下:

Rectangle()
    .fill(Color.red)
    .frame(width: 60, height: 60, alignment: .center)
    .cornerRadius(recording ? 5 : 30)

所以我想知道.frame 是否可以像.cornerRadius 一样是有条件的。我这样做是为了变形形状,但是当它变形时我还需要使它变小。一个例子是语音备忘录应用的录音按钮。

【问题讨论】:

【参考方案1】:

是的,您也可以将三元条件语句与 .frame 一起使用。

例子:

.frame(width: recording ? 40 : 60, height: recording ? 40 : 60, alignment: .center)

【讨论】:

谢谢,显然我在这样做时的错误是没有使用 self.recording【参考方案2】:

如果您说的是完全不使用帧修饰符(或提供一种干净的方式来处理不同的帧),ViewModifier 可能是一个不错的选择:

struct ContentView: View 
    @State private var recording = false
    
    var body: some View 
        Rectangle()
            .fill(Color.red)
            .modifier(CustomFrameModifier(active: recording))
            .cornerRadius(recording ? 5 : 30)
    


struct CustomFrameModifier : ViewModifier 
    var active : Bool
    
    @ViewBuilder func body(content: Content) -> some View 
        if active 
            content.frame(width: 60, height: 60, alignment: .center)
         else 
            content
        
    

【讨论】:

哦,好吧。这实际上清洁了很多。非常感谢! 这样一个聪明而有创意的解决方案!我认为这是最好的方法,因为它也为您提供了没有维度可以通过的灵活性。可以轻松扩展以获取三元表达式的参数,因此它本质上可以具有以下三种状态之一:值 a、b 和 nil。【参考方案3】:

我假设你想要这样的东西

        Rectangle()
            .fill(Color.red)
            .frame(width: recording ? 45 : 60, height: recording ? 30 : 60, alignment: .center)
            .cornerRadius(recording ? 5 : 30)
            .onTapGesture 
                recording.toggle()
            
            .animation(.default, value: recording)

【讨论】:

【参考方案4】:

您可以使用?


import SwiftUI

struct ContentView: View 
    
    @State private var recording: Bool = Bool()
    @State private var color: Color = Color.blue
    
    var body: some View 
        
        ZStack 
            
            Circle()
                .fill(Color.white)
                .frame(width: 60.0, height: 60.0, alignment: .center)
                .shadow(radius: 10.0)
            
            Circle()
                .fill(color)
                .frame(width: recording ? 30.0 : 60.0, height: recording ? 30.0 : 60.0, alignment: .center)  // <<: Here!

 
        
        .onTapGesture  recording.toggle() 
        .animation(.easeInOut, value: recording)
        .onChange(of: recording)  newValue in if newValue  colorFunction()  else  color = Color.blue  

    
    
    
    func colorFunction() 

        if (color != Color.red)  color = Color.red  else  color = Color.clear 
        
        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1))  if recording  colorFunction()  
        
    
    

【讨论】:

以上是关于SwiftUI 条件 .frame 视图修饰符的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:自定义视图修饰符不符合 ViewModifier?

在 SwiftUI 的自定义视图中访问图像的修饰符

包括基于平台的 SwiftUI 视图修饰符

SwiftUI:超过 4 个组合的文本视图不能与视图修饰符一起使用

使自定义 SwiftUI 视图适应内置修饰符

如何在 SwiftUI 中访问视图的修饰符?