위 글은 유튜브 정대리님의 SwiftUI fundamental Tutorial 강좌를 보고 작성한 정리글로
자세한 내용은 유튜브를 통해 확인하시길 권장합니다.
아래 형태는 같은 것임
Button(action: {
                
}, label: {
                
})Button(action: {
                
}){
                
}
여태까지 버튼을 만들고 속성을 준 방식
import SwiftUI
struct ContentView: View {
    var body: some View {
        VStack{
            Button(action: {
                print("button clicked")
            }, label: {
                Text("tab")
                    .fontWeight(.bold)
                    .font(.system(size: 20))
                    .foregroundColor(.white)
                    .padding()
                    .background(Color.blue)
                    .cornerRadius(20)
            })
        }
    }
}
설정해야 할 것이 너무 많음
이 속성들을 Button Style로 묶을 수 있음
import SwiftUI
struct MyButtonStyle : ButtonStyle{
    
    
    func makeBody(configuration: Configuration) -> some View {
        
        
        configuration.label
        
    }
    
}
struct MyButtonStyle_PreViews: PreviewProvider{
    
    static var previews: some View{
        
        Button(action: {
            print("clicked")
        }, label: {
            Text("test")
        })
        
    }
}
configuration은 해당하는 Style로 만들어지는 버튼을 의미함
label은 configuration의 글자라고 생각해도 됨
따라서
configuration.label //버튼의 글자
configuration.isPressed //버튼의 클릭 여부
configuration.self //버튼 자기 자신
이 같이 표현할 수 있음
PreviewProvider에서도 버튼 형태로 불러와야 미리보기 창으로 화면을 확인 할 수 있다
ButtonStyle에서 버튼 스타일 적용하기
import SwiftUI
struct MyButtonStyle : ButtonStyle{
    
    
    func makeBody(configuration: Configuration) -> some View {
        
        
        configuration.label
            .padding()
            .background(Color.red)
        
    }
    
}
struct MyButtonStyle_PreViews: PreviewProvider{
    
    static var previews: some View{
        
        Button(action: {
            print("clicked")
        }, label: {
            Text("test")
        }).buttonStyle(MyButtonStyle())
        
    }
}
PreviewProvider의 .buttonStyle(MyButtonStyle())은 MyButtonStyle에 인스턴스를 하겠다를 의미
따라서 MyButtonStyle에서 설정한 것들이 적용됨
ContentView에서 적용한 버튼 스타일들을 적용시키기
import SwiftUI
struct MyButtonStyle : ButtonStyle{
    
    
    func makeBody(configuration: Configuration) -> some View {
        
        
        configuration.label
            .font(.system(size: 20))
            .foregroundColor(.white)
            .padding()
            .background(Color.blue)
            .cornerRadius(20)
        
    }
    
}
struct MyButtonStyle_PreViews: PreviewProvider{
    
    static var previews: some View{
        
        Button(action: {
            print("clicked")
        }, label: {
            Text("test")
        }).buttonStyle(MyButtonStyle())
        
    }
}
configuration.isPressed 적용하기
import SwiftUI
struct MyButtonStyle : ButtonStyle{
    
    
    func makeBody(configuration: Configuration) -> some View {
        
        
        configuration.label
            .font(.system(size: 20))
            .foregroundColor(.white)
            .padding()
            .background(Color.blue)
            .cornerRadius(20)
            .scaleEffect(configuration.isPressed ? 1.3 : 1.0)
        
    }
    
}
struct MyButtonStyle_PreViews: PreviewProvider{
    
    static var previews: some View{
        
        Button(action: {
            print("clicked")
        }, label: {
            Text("test")
        }).buttonStyle(MyButtonStyle())
        
    }
}
버튼에 다양한 효과 주기
1) tab 효과 (haptic 효과로 짧게 진동 주기)
2) long (tab) 효과 (haptic 효과로 길게 진동 주기)
import SwiftUI
enum ButtonType{
    case tab
    case long
}
struct MyButtonStyle : ButtonStyle{
    
    var color : Color
    var type : ButtonType
    
    func makeBody(configuration: Configuration) -> some View {
        
        VStack{
            configuration.label
                .font(.system(size: 20))
                .foregroundColor(.white)
                .padding()
                .background(color)
                .cornerRadius(20)
                .scaleEffect(configuration.isPressed ? 1.3 : 1.0)
                .onTapGesture {
                    if (self.type == .tab){
                        let haptic = UIImpactFeedbackGenerator(style: .light)
                        haptic.impactOccurred()
                    }
                }.onLongPressGesture {
                    if (self.type == .long){
                        let haptic = UIImpactFeedbackGenerator(style: .heavy)
                        haptic.impactOccurred()
                    }
                }
                
        }
    }
    
}
struct MyButtonStyle_PreViews: PreviewProvider{
    
    static var previews: some View{
        
        Button(action: {
            print("clicked")
        }, label: {
            Text("test")
        }).buttonStyle(MyButtonStyle(color: Color.blue, type: .tab))
    }
}3) reduction 효과
import SwiftUI
struct Smaller : ButtonStyle{
    
    var color : Color
    
    func makeBody(configuration: Configuration) -> some View {
        
        VStack{
            configuration.label
                .font(.system(size: 20))
                .foregroundColor(.white)
                .padding()
                .background(color)
                .cornerRadius(20)
                .scaleEffect(configuration.isPressed ? 0.8 : 1.0)
                .opacity(configuration.isPressed ? 0.5 : 1.0)
                
        }
    }
}
struct Smaller_PreViews: PreviewProvider{
    
    static var previews: some View{
        
        Button(action: {
            print("clicked")
        }, label: {
            Text("test")
        }).buttonStyle(Smaller(color: Color.blue))
    }
}4) rotation 효과
import SwiftUI
struct RotateButton : ButtonStyle{
    
    var color : Color
    
    func makeBody(configuration: Configuration) -> some View {
        
        VStack{
            configuration.label
                .font(.system(size: 20))
                .foregroundColor(.white)
                .padding()
                .background(color)
                .cornerRadius(20)
                .rotationEffect(configuration.isPressed ? .degrees(90): .degrees(0))
            //anchor: 회전 기준 조건을 줄 수 있음
                
        }
    }
    
}
struct RotateButton_PreViews: PreviewProvider{
    
    static var previews: some View{
        
        Button(action: {
            print("clicked")
        }, label: {
            Text("test")
        }).buttonStyle(RotateButton(color: Color.blue))
    }
}5) blur 효과
import SwiftUI
struct BlurButton : ButtonStyle{
    
    var color : Color
    
    func makeBody(configuration: Configuration) -> some View {
        
        VStack{
            configuration.label
                .font(.system(size: 20))
                .foregroundColor(.white)
                .padding()
                .background(color)
                .cornerRadius(20)
                .blur(radius: configuration.isPressed ? 10 : 0)
                
        }
    }
}
struct BlurButton_PreViews: PreviewProvider{
    
    static var previews: some View{
        
        Button(action: {
            print("clicked")
        }, label: {
            Text("test")
        }).buttonStyle(BlurButton(color: Color.blue))
    }
}
ButtonStyle을 ContentView에 엮기
import SwiftUI
struct ContentView: View {
    var body: some View {
        VStack(spacing: 30){
            Button(action: {
                print("button clicked")
            }, label: {
                Text("tab")
                    .fontWeight(.bold)
            }).buttonStyle(MyButtonStyle(color: Color.blue, type: .tab))
            
            Button(action: {
                print("button clicked")
            }, label: {
                Text("long")
                    .fontWeight(.bold)
            }).buttonStyle(MyButtonStyle(color: Color.green, type: .long))
           
            Button(action: {
                print("button clicked")
            }, label: {
                Text("reduction")
                    .fontWeight(.bold)
            }).buttonStyle(Smaller(color: Color.purple))
           
            
            Button(action: {
                print("button clicked")
            }, label: {
                Text("rotate")
                    .fontWeight(.bold)
            }).buttonStyle(RotateButton(color: Color.pink))
            
            Button(action: {
                print("button clicked")
            }, label: {
                Text("blur")
                    .fontWeight(.bold)
            }).buttonStyle(BlurButton(color: Color.black))
           
        }
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
'강의 > etc' 카테고리의 다른 글
| [SwiftUI fundamental Tutorial] Toast, Popup (0) | 2021.09.16 | 
|---|---|
| [SwiftUI fundamental Tutorial] TextField, SecureField (0) | 2021.09.14 | 
| [SwiftUI fundamental Tutorial] Custom TabView (0) | 2021.09.01 | 
| [SwiftUI fundamental Tutorial] TabView (0) | 2021.08.31 | 
| [SwiftUI fundamental Tutorial] GeometryReader (0) | 2021.08.31 |