Devlog
article thumbnail

위 글은 유튜브 정대리님의 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()
    }
}

profile

Devlog

@덩이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그