Project2 : Slider
Flag 배열 생성
Slider
를 사용하여 프로젝트를 만들어보겠습니다.
첫 번째로, ContentView
에 NavigationView
를 생성해서 NavigationBarTitle
을 "국기"로 정해주겠습니다,
struct ContentView: View {
let flag = ["🇰🇷", "🇺🇸", "🇯🇵", "🇪🇺", "🇸🇱", "🇧🇪", "🇲🇨", "🇬🇳", "🇿🇦", "🇳🇮", "🇨🇦", "🇹🇷", "🇨🇮", "🇮🇹", "🇬🇧", "🇨🇭", "🇸🇴"]
var body: some View {
NavigationView {
VStack {
}
.navigationBarTitle("국기")
}
}
}
그리고 flag
의 배열에 한 번 더 배열로 감싸주겠습니다. 짝을 지어주는거죠
let flag = [["🇰🇷", "🇺🇸"],["🇯🇵", "🇪🇺"],["🇸🇱", "🇧🇪"],["🇲🇨", "🇬🇳",],
["🇿🇦", "🇳🇮"],["🇨🇦", "🇹🇷", "🇨🇮"],["🇮🇹", "🇬🇧"],["🇨🇭", "🇸🇴"]]
var body: some View {
NavigationView {
VStack {
List(self.flag, id: \.self) { flagPair in
ForEach(flagPair, id: \.self) { flags in
Text(flags)
//국기의 크기를 설정
.font(.system(size: 100))
}
}
}
.navigationBarTitle("국기")
}
}
Extenstion 생성
Xcode
에 새로운 폴더를 만들고, 이름을 Extension
이라고 정합니다. 새로운 폴더를 생성 후 이름은 'Array+Extension
'이라고 설정해줬습니다. 코드를 다음과 같이 작성해줍니다.
//Array+Extension.swift
import Foundation
//배열을 설정하는 익스텐션
extension Array {
//chunks라는 변수를 만든다.
func chunks(size: Int) -> [ArraySlice<Element>] {
var chunks: [ArraySlice<Element>] = [ArraySlice<Element>]()
// stride는 한 항목에서 다른 항목으로, 현위치에서 다른위치로 이동할 수 있게 한다.
for index in stride(from: 0, through: self.count - 1, by: size) {
var chunk = ArraySlice<Element>()
let end = index + size
if end >= self.count {
chunk = self[index..<self.count]
} else {
chunk = self[index..<end]
}
chunks.append(chunk)
if (end + 1) == self.count {
let remainingChunk = self[end..<self.count]
chunks.append(remainingChunk)
}
}
//반환값
return chunks
}
}
Slider 될 때마다 이미지 추가
자, Extension
을 만들어줬으면 이제 이것을 ContentView
에 적용시켜보도록 하겠습니다.
struct ContentView: View {
let flag = [...]
@State private var sliderValue: CGFloat = 1
그리고 슬라이드 할 때 마다 숫자가 바뀌는 코드를 생성해줘야 합니다.
VStack
안에 다음과 같은 코드를 작성해주겠습니다.
VStack {
//3페이지 까지만 보여줌
Slider(value: $sliderValue, in: 1...3, step: 1)
//슬라이드 할 때 마다 숫자가 변함
Text(String(format: "%.0f", self.sliderValue))
.font(.system(size: 20))
.fontWeight(.bold)
.padding()
.background(Color.black)
.foregroundColor(Color.white)
.clipShape(Circle())
슬라이더를 움직일 때마다 숫자가 바뀌지만, 아래 이미지는 바뀌지 않는 것을 확인할 수 있습니다.
우리는 Extentsion
을 따로 만들어줬으니, 이것을 ContentView
에 적용시켜야 합니다.
먼저, flag
를 재 배열해줍니다.
let flag = ["🇰🇷", "🇺🇸", "🇯🇵", "🇪🇺", "🇸🇱", "🇧🇪", "🇲🇨", "🇬🇳","🇿🇦", "🇳🇮", "🇨🇦", "🇹🇷", "🇨🇮", "🇮🇹", "🇬🇧","🇨🇭", "🇸🇴"]
그리고 List
부분을 다음과 같이 수정해줍니다.
List(self.flag.chunks(size: self.sliderValue), id: \.self) { flagPair in
ForEach(flagPair, id: \.self) { flags in
Text(flags)
//국기의 크기를 설정
.font(.system(size: 100))
}
}
List(self.flag.chunks(size: self.sliderValue)
를 넣어주면 오류가 생깁니다.
sliderValue
는 CGFloat
값 이기 때문에 Int
가 와야 하기 때문이죠. Fix
를 눌러주면 다음과 같은 코드가 됩니다.
List(self.flag.chunks(size: Int(self.sliderValue)), id: \.self) { flagPair in
ForEach(flagPair, id: \.self) { flags in
Text(flags)
//국기의 크기를 설정
.font(.system(size: 100))
}
}
flagPair
부분도 chunk
라고 수정해줍니다.
List(self.flag.chunks(size: Int(self.sliderValue)), id: \.self) { chunk in
ForEach(chunk, id: \.self) { flags in
Text(flags)
//국기의 크기를 설정
.font(.system(size: 100))
}
}
화면을 이미지가 꽉 채워질 수 있도록 사이즈를 조절해주도록 하겠습니다.
List(self.flag.chunks(size: Int(self.sliderValue)), id: \.self) { chunk in
ForEach(chunk, id: \.self) { flags in
Text(flags)
//국기의 크기를 설정
//숫자를 변경해보면 화면에 딱맞는건 300이라는걸 알 수 있다.
.font(.system(size: CGFloat(300/self.sliderValue)))
}
}
전체 코드
contentView
import SwiftUI
struct ContentView: View {
let flag = ["🇰🇷", "🇺🇸", "🇯🇵", "🇪🇺", "🇸🇱", "🇧🇪", "🇲🇨", "🇬🇳","🇿🇦", "🇳🇮", "🇨🇦", "🇹🇷", "🇨🇮", "🇮🇹", "🇬🇧","🇨🇭", "🇸🇴"]
@State private var sliderValue: CGFloat = 1
var body: some View {
NavigationView {
VStack {
Slider(value: $sliderValue, in: 1...7, step: 1)
//슬라이드 할 때 마다 숫자가 변함
Text(String(format: "%.0f", self.sliderValue))
.font(.system(size: 20))
.fontWeight(.bold)
.padding()
.background(Color.black)
.foregroundColor(Color.white)
.clipShape(Circle())
List(self.flag.chunks(size: Int(self.sliderValue)), id: \.self) { chunk in
ForEach(chunk, id: \.self) { flags in
Text(flags)
//국기의 크기를 설정
//숫자를 변경해보면 화면에 딱맞는건 300이라는걸 알 수 있다.
.font(.system(size: CGFloat(300/self.sliderValue)))
}
}
}
.navigationBarTitle("국기")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
extension
import Foundation
//배열을 설정하는 익스텐션
extension Array {
//chunks라는 변수를 만든다.
func chunks(size: Int) -> [ArraySlice<Element>] {
var chunks: [ArraySlice<Element>] = [ArraySlice<Element>]()
// stride는 한 항목에서 다른 항목으로, 현위치에서 다른위치로 이동할 수 있게 한다.
for index in stride(from: 0, through: self.count - 1, by: size) {
var chunk = ArraySlice<Element>()
let end = index + size
if end >= self.count {
chunk = self[index..<self.count]
} else {
chunk = self[index..<end]
}
chunks.append(chunk)
if (end + 1) == self.count {
let remainingChunk = self[end..<self.count]
chunks.append(remainingChunk)
}
}
//반환값
return chunks
}
}
읽어주셔서 감사합니다🤟
본 게시글의 전체코드 GitHub 👇🏻
[SwiftUI 기초/View layout] - SwiftUI : Slider
[SwiftUI 기초/View layout] - SwiftUI : ForEach
[SwiftUI 기초/View layout] - SwiftUI : List (ListStyle / onDelete / onMove)
'PROJECT > Simple' 카테고리의 다른 글
SwiftUI Project6 : Use Views From Other Frameworks (0) | 2021.03.08 |
---|---|
SwiftUI Project5 : 날씨앱 'SwiftUI 기초 배우기' (0) | 2021.03.06 |
SwiftUI Project4 : Lottie 애니메이션으로 카드만들기 (0) | 2021.02.10 |
SwiftUI Project3 : List view를 사용하여 Grid 만들기 (0) | 2021.02.09 |
SwiftUI Project1 : Extension으로 정보가져오기 (0) | 2021.02.02 |