import SwiftUI
struct ContentView: View {
static let dateFormat: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "YYYY년 M월 d일"
// formatter.dateStyle = .long
return formatter
}()
private var today = Date()
private var trueOrFalse: Bool = false
private var number: Int = 123
var body: some View {
VStack {
Text("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s,")
.tracking(2) // 글자 사이의 간격
.font(.system(.body, design: .rounded))
.fontWeight(.medium) // font의 두께
.multilineTextAlignment(.center) // 글자 정렬
.lineLimit(nil) // SwiftUI에서는 nil로 해야 multiLine이 적용된다.
.lineSpacing(10) // 행간의 간격
.truncationMode(.middle) // 글자가 View의 크기보다 길때 잘리는 위치
.shadow(color: Color.red, radius: 1.5, x: -10, y: 10) // radius는 범위라고 생각하면된다. 숫자가 커질수록 그림자의 범위가 커져서 흐려지게 보인다.
.padding(20)
.background(Color.yellow)
.cornerRadius(10)
.padding()
.background(Color.green)
.cornerRadius(20)
.padding()
Text("안녕하세요!")
.background(Color.gray)
.foregroundColor(Color.white)
Text("오늘의 날짜입니다. : \(today, formatter: ContentView.dateFormat)")
.padding(.top)
Text("참 혹은 거짓: \(String(trueOrFalse))")
.padding(.top)
Text("숫자입니다: \(number)")
.padding(.top)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
UILabel과 Text?
✏️UILabel
- 단순히 문자열을 화면에 표현해준다.
Text
- 단순히 표현만 하는게 아니라 Button, Toggle, Picker 등에서 텍스트를 적용할 때 사용하며 UILabel보다 더 광범위하다.
- 예를들어, Button을 구현하는데 있어서 Text를 버튼의 구현체로 사용할 수 있다.
사용한 수식어
✏️- tracking
- 텍스트 사이의 간격을 설정할 수 있다.
- 값이 커질수록 텍스트 사이의 간격이 커진다. ex) Lorem -> L o r e m
- 텍스트 사이의 간격을 설정할 수 있다.
- font
- 텍스트의 폰트를 설정할 수 있다.
- fontWeight
- 폰트의 두께를 설정할 수 있다.
- multilineTextAlignment
- 텍스트의 정렬을 설정할 수 있다.
- lineLimit
- 텍스트의 행의 수를 제어할 수 있다.
- UIKit에서는 0으로 설정하는것이 SwiftUI에서는 nil로 설정하는 것과 같다.
- 텍스트의 행의 수를 제어할 수 있다.
- lineSpacing
- 행간의 간격을 설정할 수 있다.
- tracking과 마찬가지로 값이 커질수록 간격이 커진다.
- 행간의 간격을 설정할 수 있다.
- truncationModetruncationMode
- 텍스트의 길이가 View의 크기보다 길때 잘리는 위치를 설정할 수 있으며, head, middle, tail의 옵션이 있다.
- head
- middle
- tail
- shadow
- shadow는 텍스트의 그림자를 설정할 수 있다.
- color는 그림자의 색을 지정한다.
- x, y를 통해 그림자의 위치를 설정할 수 있다.
- radius는 범위라고 생각하면 된다. 값이 커질수록 그림자의 범위가 커져서 흐려지게 보인다.
- radius = 1.5
- radius = 3
- shadow는 텍스트의 그림자를 설정할 수 있다.
수식어 적용시 주의점
✏️수식어는 그 자체 수식어와 뷰 프로토콜이 가진 수식어로 나뉜다.
bold, foreground, italic 등의 return 타입이 Text인 반면, trancationMode, lineLimit 등의 return 타입은 some View로 서로 다른 것을 알 수 있다.
즉, 이 말은 적용하는 순서가 중요하다고 말해준다.
개발자가 의도하지 않은 결과로는 두가지가 나온다고 생각한다. 첫번째는 컴파일 에러가 나는것과, 두번째로는 에러는 나지 않더라도 원하는 UI가 구성되지 않는 것이다.
1. 컴파일 에러
//문제 없음
Text("타입 테스트")
.font(.title) // return Text
.bold() // return Text
.padding() // return View
// 문제 없음
Text("타입 테스트2")
.bold() // return Text
.lineLimts(1) // return View
.font(.title) // return View - font란 호출자에 따라 반환타입이 다르므로 컴파일 에러 발생하지 않는다.
//컴파일 에러
Text("타입 테스트3")
.padding() // return View
.bold() // return Text - 컴파일 에러 발생 Some view타입에는 bold수식어가 없으므로 컴파일 에러가 발생한다.
//컴파일 에러
Text("타입 테스트 4")
.padding() // return View
.font(.large) // return View
.bold // return Text - 앞 문제와 같이 some View타입에는 bold수식어가 없기 때문에 컴파일 에러가 발생한다.
2. 의도치않은 UI구성
이번 프로젝트를 통한 예시와 블로그에서 좋은 예시가 있어 총 두개의 예시를 통해 이해해보자.
2-1. 첫 번째 예시
- 원했던 결과
- 실제 모습
- 문제의 코드
.padding(20)
.cornerRadius(10)
.background(Color.yellow)
바깥의 초록색 View처럼 cornerRadius를 사용하여 코너부분을 부드럽게 만들고싶었으나, 코드를 잘 보면 cornerRadius를 padding에 준것을 볼 수 있다. 실제로 padding에 색깔을 적용시켜 확인시켜보면,
.padding(20)
.background(Color.red)
.cornerRadius(10)
.background(Color.yellow)

- 해결한 코드
.padding(20)
.cornerRadius(10)
.background(Color.yellow)

2-2. 두 번째 예시
//1번
Text("😍😒☺️😊😘").font(.largeTitle)
.border(Color.red, width: 3)
.background(Color.blue)
.padding()
//2번
Text("😍😒☺️😊😘").font(.largeTitle)
.border(Color.red, width: 3)
.padding()
.background(Color.blue)
첫 번째는 background를 먼저 적용하고 padding을 준 반면 두 번째는 padding을 먼저 주고 background를 적용했다.

단지 적용하는 순서만 변경해주었는데 배경색의 범위가 달라진 것을 확인할 수 있다.
[1번]
- 텍스트를 생성
- 텍스트의 테두리를 빨간색, 5 굵기로 추가
- 텍스트와 크기가 동일한 파란색 배경 추가
- padding을 통해 뷰에 여백 추가
[2번]
- 텍스트를 생성
- 텍스트의 테두리를 빨간색, 5굵기로 추가
- padding을 통해 뷰에 여백 추가
- padding이 적용된 뷰의 크기와 동일한 배경 추가
이렇게 수식어 적용 순서에 따라 적용되는 범위도 달라진다. Text를 사용할 때 수식어의 순서를 잘 고려해 적용해야겠다.
'SwiftUI' 카테고리의 다른 글
SwiftUI) Layout_Practice_with_Stacks_#1 (0) | 2023.03.29 |
---|---|
SwiftUI) Stacks (0) | 2023.03.29 |
SwiftUI) Image (0) | 2023.03.29 |
SwiftUI) WebView (0) | 2023.03.29 |
SwiftUI? (0) | 2023.03.29 |
댓글