SwiftUI 3.0 버전의 Button 기능이 다수 추가되었습니다. 추후 업데이트 예정입니다.
트리거(Trigger) 될 때 작업을 수행하는 컨트롤입니다.
Button
에 대해 알아보도록 합시다.
Button
기본 코드
//첫번째 Button(action: { //action }) { //view HStack { Image(systemName: "folder.fill") Text("폴더") } }
//두번째 Button("서근개발노트") { // action }
Action
과 Label
을 제공하여 버튼을 만들 수 있습니다.
액션은 사용자가 버튼을 클릭하거나 택할 때 작업을 수행하는 메서드 또는 클로저 프로퍼티입니다.
레이블은 예를 들어 '취소'와 같은 텍스트 또는 '뒤로 가기 화살표'와 같은 아이콘을 표시하여 단추의 동작을 실행하는 view입니다.
버튼의 기본이 되는 생성 코드는 Button(action: { } ) { Text(" ") }
입니다.
Button(action: { }) { Text("Tap me!") }
Button(action: signIn) { Text("Sign In") }
텍스트 전용 레이블의 일반적인 경우에는 후행 클로저 대신 제목 문자열 (또는 현지화된 문자열 키)을 첫 번째 매개 변수로 사용하는 편리한 이니셜 라이저를 사용할 수 있습니다.
즉, 버튼 안쪽에 Text를 따로 빼지 않고 Button("Sign In") { action: signIn }
처럼 간단하게 사용할 수 있습니다.
Button("Sign In") { //some action }
버튼에 액션 넣기
button
을 눌렀을 때 텍스트를 표시하거나 숨기는 버튼을 만들 수 있습니다.
showDetails
을 @State
에서 false
로 지정해두고, self.showDetails.toggle()
로 토글이 된다면,
아래 조건문과 같은 텍스트가 나오게 됩니다.
struct ContentView: View { @State private var showDetails = false var body: some View { VStack { Button(action: { self.showDetails.toggle() }) { Text("디테일 보기") } if showDetails { Text("서근 개발블로그 구독 부탁드려요") .font(.largeTitle) } } } }
이미지 넣기
만약 이미지를 추가하고 싶다면 아래와 같은 코드를 작성할 수 있습니다.
Button(action: { self.showDetails.toggle() }) { Image("example-image") .renderingMode(.orginal) }
Symbol 이미지를 이용하여 버튼을 넣어주려면 아래와 같이 사용자 속성을 지정하여 작성할 수 있습니다.
Button(action: { }) { HStack { Text("String") Image(systemName: "icon.name") } }
struct ContentView: View { var body: some View { Button(action: { }) { HStack { Image(systemName: "pencil") Text("Edit") } .font(.system(size: 60)) .foregroundColor(.black) } } }

버튼 사용자 속성 추가
Button(action: { print("Delete tapped!") }) { HStack { Image(systemName: "trash") .font(.title) Text("Delete") .fontWeight(.semibold) .font(.title) } .padding() .foregroundColor(.white) .background(Color.red) .cornerRadius(40) }

그라데이션을 활용한 버튼 (SwiftUI : Colors and Gradient)
.background(Color.red)
부분을 아래 코드로 바꿔주면 그라데이션 효과를 볼 수 있습니다.
.background(LinearGradient(gradient: Gradient(colors: [Color.red, Color.blue]), startPoint: .leading, endPoint: .trailing))

Container 버튼 추가
트리거 되는 모든 사용자 인터페이스 요소에는 버튼을 사용합니다.
버튼은 이러한 다양한 컨테이너 및 콘텍스트 내에서 예상되는 스타일과 일치하도록 시각적 스타일을 자동으로 조정합니다.
예를 들어, 사용자가 선택했을 때 작업을 트리거하는 목록 셀을 만들려면 List
의 콘텐츠에 버튼을 추가합니다.
// 마지막 행이 트리거될 때의 항목 목록 // 새 항목을 추가하기 위한 UI를 연다. List { ForEach(items) { item in Text(item.title) } Button("Add Item", action: addItem) }
ButtonStyle
iOS 기준으로는 총 3가지의 버튼 스타일이 제공됩니다.
- DefaultButtonStyle
기본적으로 적용되는 값. 모든 OS에서 공통으로 사용할 수 있는 버튼 스타일
- BorderlessButtonStyle
IOS에서 대부분의 경우에 기본 반영되는 스타일. 테두리를 그리지 않음. 하지만 현재 IOS에서 제공하는 스타일 중에 테두리는 그리는 버튼은 없지만 MacOS에선 BorderedButtonStyle이 함께 제공되므로 이것과 대조되는 의미에서 이 스타일이 제공됨.
- PlainButtonStyle
모든 OS에서 공통으로 사용할 수 있는 버튼 스타일로, 유휴 상태(IDLE)에서는 버튼의 콘텐츠에 어떠한 시작적 요소도 적용하지 않음
VStack { // 1 Button("DefaultButtonStyle") { // some action } .buttonStyle(DefaultButtonStyle()) Divider() // 2 Button("BorderlessButtonStyle") { // some action } .buttonStyle(BorderlessButtonStyle()) Divider() // 3 Button(action: { // some action }) { Text("PlainButtonStyle") } .buttonStyle(PlainButtonStyle()) }

onTapGesture
onTapGesture
수식어를 이용하면 버튼을 사용하지 않고도 동일한 기능을 구현할 수 있습니다. 이름에서 알 수 있듯이 Tap
했을 때 지정된 동작을 수행하는 수식어로 어느 View
에서나 쉽게 추가하고 사용하는 것이 가능합니다.
예를 들어 이미지를 눌렀을 때 글자가 출력되도록 하는 기능을 Button
과 onTapGesture
를 사용하여 비교해보겠습니다.
1. onTapGesture
// onTapGesture struct ContentView: View { @State private var showImage = false var body: some View { VStack { if showImage { Image(systemName: "moon.stars.fill") } Text("onTapGesture").onTapGesture { self.showImage.toggle() } } } }
2. Button
//Button struct ContentView: View { @State private var showImage = false var body: some View { VStack { if showImage { Image(systemName: "moon.stars.fill") } Button(action: { self.showImage.toggle() }) { Text("Button") } } } }


버튼과 onTapGesture의 다른 점onTapGesture
수식어로는 버튼을 누를 때 동작하는 애니메이션과 같은 기본 효과들이나 커스텀 버튼 스타일 등은 사용할 수 없다는 것을 기억해야 합니다.
읽어주셔서 감사합니다🤟
'SWIFTUI > Controls' 카테고리의 다른 글
SwiftUI : Toggle Switch (toggleStyle) (0) | 2021.03.18 |
---|---|
SwiftUI : Alert (알림 메세지) (0) | 2021.01.23 |
SwiftUI : EditButton [onDelete, OnMove] (1) | 2021.01.23 |
SwiftUI : TextEditor (0) | 2021.01.21 |
SwiftUI : SecureField (0) | 2021.01.21 |