• Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

SwiftUI : Stack, Text, Image

Stack

image

image

image

  • 순서대로 VStack{}, HStack{}, ZStack{}

    VStack{
      Text{"Hello, World!"} //ZStack일 땐 여기가 가장 밑에 깔림
      Text{"Hello, World!"}
      Text{"Hello, World!"}
    }
    
  • 화면 구성할 때 가장 기본

  • 중첩 사용 가능

color 넣기 : Color

Color.init(red: DOUBLE(xxx/255), green: DOUBLE, blue: DOUBLE)
Color.red

Stack에 Color 넣으면 전체 뷰의 배경색이 되는데, Stack에만 배경색을 주고싶으면

Text("world!")
	.background(Color.green) //보통 이렇게 밑줄에 표시 - 설정이 여러 개 올 수 있음

safearea도 무시하고 전체 뷰에 배경색을 주고싶다면

ZStack{
  Color.green
  	.edgesIgnoringSafeArea(.all) //위아래 다 무시
  	.edgesIgnoringSafeArea(.top) //위만 무시
  	.edgesIgnoringSafeArea(.bottom) //아래만 무시
}

vstack으로 하면

image 이렇게 됨.. .all으로 했는데도배경을 다 못채움 -> Color랑 Text가 VStack인거니까

그래서 배경을 깔고 그 위에 뭘 하려고 하면 ZStack 이용

padding 값 주기

VStack{}.padding() //기본값 : 네방향 다
VStack{}.padding(.leading, 20) //지정가능 
Text("").padding(.top, 50) //Text에 padding 주기

Text

Text("hello")
	.font(.largeTitle) // 폰트 크기 - .caption, .title3, .body ...
	.underline()
	.bold()
	.forgroundColor(.red) // 폰트 색상
	.padding()
	.frame(width:100, height:50) //강제 크기 지정, 넓이/높이 둘 중 하나만 지정 가능, 잘리는 부분은 ... 됨
	.background(Color.green)
	.cornerRadius(10) // 얘는 button이나 image에서 많이 쓰는 거, 값이 아무리 커도 radius/2가 최대 적용(원모양)
	.lineLimit(1) // 얘랑 .frame이랑 쓰면 width만 지정해도 두줄로 안 바뀌고 한줄 고정
	.lineLImit(nil) // 줄 개수 지정 X
	.truncationMode(.head) // .middle, .tail - 어디가 짤려서 ...로 표시될지 지정
	.lineSpacing(30) //줄간격, 음수 가능(그렇다고 겹쳐지진 않음)
	.multilineTextAlignment(.center) // 여러 줄의 text align 설정

순서를 고려해야 한다

Text("hi")
	.padding()
	.background(Color.green) // padding 영역만큼 배경색 지정됨

	.background(Color.green)
	.padding() // 아래처럼 됨 - 배경 먼저 잡히고 그 다음 padding 추가

image

텍스트 뷰 안에 표시되는 텍스트의 포맷 설정 - formatter

  • 날짜 형식
struct ContentView = View{
	static let taskDateFormat: DateForamtter = {
		let formatter = DateFormatter()
    formatter.dateStyle = .long
    return formatter
	}()
  
  var dueDate = Date()
  var body: some View {
    Text("Task due date: \(dueDate, formatter: Self.taskDateFormat)")
  }
}

image

Image

파일명 : 1.png (500*334 px) 라고 가정

Image("1")
	.resizable() // 아이폰 전체 크기에 꽉차게 됨, 이미지 크기 조절을 위해 거의 필수
	.frame(width: 300) // frame 영역 잡힘, resizable()이랑 같이 써줘야 이미지 크기 변경됨
	// frame 에서 특정 요소 지정 안하면 아이폰 전체크기만큼으로 잡힘
 	.padding() // .frame 안 쓰고 .padding 주는 경우도 있음
  .edgesIgnoringSafeArea(.all)
  .aspectRatio(contentMode: .fit) //.fill 도 있음
  • SF-Symbol 사용하기

    Image(systemName: "symbol-name")
    Image(systemName: "circle") //example
    	.forgroundColor(.blue) //색상지정
    
  • UIImage를 통해 이미지 불러오기

    gurad let img = UIImage(named: "1") else {
      fatalError("Fail to load image")
    }
      
    return Image(uiImage: img)
    
  • 그라데이션 효과 주기 (Image에 넣어야하나 Text에 넣어야하나,,,)

    Text("HELLO")
    	.background(LinearGradient(gradient: Gradieng(colors: [.white, .black]), startPoint: .top, endPoint: .bottom))
    
  • 이미지 여러 개 VStack에 넣기

    VStack{
    	Image("1")
    	.resizable()
      .edgesIgnoringSafeArea(.all)
      .aspectRatio(contentMode: .fit)
        
      Image("1")
    	.resizable() // 아이폰 전체 크기에 꽉차게 됨
      .edgesIgnoringSafeArea(.all)
      .aspectRatio(contentMode: .fit)
    }
    

    image –> 이미지 사이에 기본적으로 간격이 있음 (Text끼리는 없지만 Image끼리는 있음)

    VStack(spacing: 0){ //간격 없애기
      이미지들
    }
    

    더 주려면 image에 padding 줘도 되는거고..

mask

Image("1")
	.resizable()
  .edgesIgnoringSafeArea(.all)
  .aspectRatio(contentMode: .fit)
  .mask(
  	Circle() //cornerRadius로 해도 되긴 하지만..
  )
  .padding(.bottom, 20)

mask도 padding과의 순서에 주의

.mask(
 	VStack(spacing:0){ // Stack에 집어넣어도 됨 - 눈사람 모양..
    Circle()
    Circle()
  } 
)

도형 그리기

Rectangle()
	.fill(Color.red)
	.frame(width:300, height:200)

Circle()
	.fill(Color.blue)
	.frame(width:300, height:200)

배경으로 이미지 사용하기

Text("helllo!")
	.background(
    	Image("1")
    		.resizable()
    		.frame(width:100, height:100, alignment: .center)
  )