apple/SwiftUI & Combine
[SwiftUI] ButtonStyle
lgvv
2022. 5. 23. 12:39
ButtonStyle
✅ 버튼 스타일에 대해서 알아보자
이건 진짜 어렵지가 않다. 정말정말 E A S Y 해 !
Configuration은 상속받아 들어오는 것의 상태를 받아서 쓰는것
✅ MyBlurButtonStyle
import SwiftUI
struct MyBlurButtonStyle: ButtonStyle {
var color : Color
// Configuration 위에서 상속받는 속성 그대로 사용할 수 있게 해줌
func makeBody(configuration: Configuration) -> some View {
configuration
.label
.font(.system(size: 20))
.foregroundColor(Color.white)
.padding()
.background(color)
.cornerRadius(20)
.blur(radius: configuration.isPressed ? 10 : 0) // 클릭때면 흐리게 할 값 설정
}
}
struct MyBlurButtonStyle_Previews: PreviewProvider {
static var previews: some View {
Button(action : {
print("button clicked!")
}, label: {
Text("호호")
}
).buttonStyle(MyBlurButtonStyle(color: Color.blue))
}
}
사용법에 대한 설명은 preview를 보고 다른 것들도 이렇게 적용하면 된다.
버튼을 만들고 마지막에 버튼 스타일을 추가한다.
여기서 makeBody의 작동방식을 눈여겨 보면 좋다.
✅ MyButtonStyle
import SwiftUI
enum ButtonType {
case tab
case long
// case tab, long, ..
}
struct MyButtonStyle : ButtonStyle {
var color : Color
var type : ButtonType
func makeBody(configuration: Configuration) -> some View {
configuration
.label
.font(.system(size: 20))
.foregroundColor(Color.white)
.padding()
.background(color)
.cornerRadius(20)
.scaleEffect(configuration.isPressed ? 1.3 : 1.0) // 버튼 사이즈
.onTapGesture {
// 짧게 탭하면 light 터치
if (self.type == .tab) {
let haptic = UIImpactFeedbackGenerator(style: .light)
haptic.impactOccurred()
}
}.onLongPressGesture {
// 길게 누르면 헤비하게 처리
if (self.type == .long) {
let haptic = UIImpactFeedbackGenerator(style: .heavy)
haptic.impactOccurred()
}
}
}
}
✅ MyRotateButtonStyle
import SwiftUI
struct MyRotateButtonStyle: ButtonStyle {
var color : Color
func makeBody(configuration: Configuration) -> some View {
configuration
.label
.font(.system(size: 20))
.foregroundColor(Color.white)
.padding()
.background(color)
.cornerRadius(20)
// degree 통해서 회전각!
// .rotationEffect(configuration.isPressed ? .degrees(90) : .degrees(0))
.rotationEffect(
configuration.isPressed
? .degrees(90)
: .degrees(0),
anchor: .bottom // 특점 지점을 기준으로 회전을 걸 수도 있다.
)
}
}
✅ MySmallerButtonStyle
import SwiftUI
struct MySmallerButtonStyle : ButtonStyle {
var color : Color
func makeBody(configuration: Configuration) -> some View {
configuration
.label
.font(.system(size: 20))
.foregroundColor(Color.white)
.padding()
.background(color)
.cornerRadius(20)
.scaleEffect(configuration.isPressed ? 0.8 : 1.0) // 버튼 작아지고
.opacity(configuration.isPressed ? 0.5 : 1.0) // 흐려지게끔
}
}