ํ์ฌ ์ฌ๋ด์์ ํค์๋๋ฅผ ๊ฒ์ํ์ฌ ๊ด๋ จ ์ฝํ ์ธ ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ฑ์ ๊ตฌํํ๊ณ ์๋ค.
๊ธฐ์ ๊ธฐํ - ์ฑ์ ๋ค์ด๊ฐ ๊ธฐ์ ๋ชฉ๋ก
- ๊ฒ์ ๋ฐ ๊ฒ์ ๊ฒฐ๊ณผ ํ์ธ
- ๊ฒ์ ํค์๋ ๊ด๋ จ ์ฝํ ์ธ (ํ ์คํธ ์ฝํ ์ธ ๋๋ ์ฑํ ๋ฐฉ)
- ํ ์คํธ ์ฝํ ์ธ
- ์์ฑ ์ฑํ ๋ฐฉ
- ๋ก๊ทธ์ธ
์ฒซ๋ฒ์งธ๋ก ํ ์คํธ ์ฝํ ์ธ ์ ๊ด๋ จ UI๋ฅผ ๊ตฌํํด๋ณด์.
ํ ์คํธ ์ฝํ ์ธ UI ๊ตฌํ

ํ ์คํธ ์ฝํ ์ธ ์์ธํ๋ฉด ๊ตฌํ
ํ ์คํธ ์ฝํ ์ธ ์์ธํ๋ฉด์ ๋ค์ด๊ฐ ์์๋ ์ ๋ชฉ, ์ถ์ฒ, ์์ฑ์ผ, MBTI ํ์ , ๊ทธ๋ฆฌ๊ณ ์ฝํ ์ธ ๋ด์ฉ์ด๋ค.
์ด๋ฅผ ์ค์ํํธ UI๋ก ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
import SwiftUI
struct ContentDetail: View {
var contItem: ContentDetailData
var body: some View {
VStack(alignment: .leading){
Group {
// ์ฝํ
์ธ ์ ํ์ดํ
Text(contItem.title)
.font(.title)
.fontWeight(.black)
.padding()
// ์ถ์ฒ์ ์์ฑ์ผ, MBTI ํ์
HStack{
Text("์ถ์ฒ:")
Text(contItem.source)
}
.font(.subheadline)
.padding(.leading)
HStack{
Text("์์ฑ์ผ:")
Text(contItem.published_at)
}
.font(.subheadline)
.padding(.leading)
HStack{
Text("MBTI:")
Text(contItem.mbti.joined(separator: " "))
}
.font(.subheadline)
.padding(.leading)
Divider()
// ์ฝํ
์ธ
Text(contItem.content)
.font(.body)
.foregroundColor(.black)
.frame(
minWidth: 300,
maxWidth: .infinity,
minHeight: 0,
maxHeight: 300,
alignment: .topLeading
)
.padding()
Divider()
}
}
}
}
struct ContentDetail_Previews: PreviewProvider {
static var previews: some View {
ContentDetail(
contItem: ModelData().contentItems[0]
).previewLayout(.fixed(width:310, height:300))
}
}
์ด UI์์๋ ContentDetailData ๋ฅผ ๋ฐ์์ ์ ๋ชฉ ๋ฐ ์ถ์ฒ ๋ฑ์ ์ฌ์ฉํ์๋ค. ์ด๋ ์ถํ REST API ๋ก ์ฝํ ์ธ ์ ๋ณด๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฏธ๋ฆฌ REST API์ ์๋ต ํํ๋ก struct ๋ฅผ ๋ง๋ค์๋ค. ContentDetailData์ ํํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
import Foundation
import SwiftUI
struct ContentDetailData: Hashable, Codable, Identifiable {
var id: Int
var title: String
var content: String
var source: String
var published_at: String
var mbti: Array<String>
private var imageStr: String
var image: Image {
Image(imageStr)
}
}
Python ์์ Dict์ ์ ์ฌํ๊ฒ struct ๋ฅผ ๊ตฌํํ์ฌ ์ฌ์ฉํ์๋ค.
(*์ด Struct ๋ ์ฝํ ์ธ ๋ชฉ๋ก์ ๋ณด์ฌ์ค ๋๋ ์ฌ์ฉํ๊ธฐ์ ์ ๋ชฉ, ์ถ์ฒ ์ธ์ ๋ค๋ฅธ ์นผ๋ผ๋ ํฌํจ๋์ด ์๋ค.)
ํ ์คํธ ์ฝํ ์ธ ๋ชฉ๋ก ๋ด Element ํ๋ฉด ๊ตฌํ
ํ ์คํธ ์ฝํ ์ธ ๋ ํค์๋ ๊ฒ์ ๋๋ ๋ฉ์ธ ํ๋ฉด์์ ์ถ์ฒ ์ฝํ ์ธ ๋ก ๋ณด์ฌ์ง ์์ ์ด๋ค. ๊ทธ๋์ ์ฝํ ์ธ ์ ์ ๋ณด๋ฅผ ๊ฐ๋ตํ๊ฒ ๋ด๊ธฐ ์ํ ๋ชฉ๋ก๋ด Element ์์๋ฅผ ๊ตฌํํด์ผํ๋ค.

์ฝ๋๋ก ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
import SwiftUI
struct ContentItem: View {
var contentData: ContentDetailData
var body: some View {
VStack(alignment: .leading){
ZStack(alignment: .leading){
contentData.image
.resizable()
.overlay{
Rectangle()
.frame(width: 100, height: 100)
.opacity(0.3)
}
.frame(width:100, height: 100)
.clipShape(Rectangle())
.cornerRadius(8)
.overlay(alignment: .top){
VStack{
Text(contentData.mbti.joined(separator: " "))
.frame(width: 80, height: 50, alignment: .topLeading)
.foregroundColor(.white)
.font(.system(size: 20, weight: .bold))
.minimumScaleFactor(0.5)
.padding(.top, 10)
}
}
}
Text(contentData.title)
.font(.headline)
.bold()
.foregroundColor(.black)
.frame(width:100)
.lineLimit(1)
.padding(0)
}.padding()
}
}
struct ContentItem_Previews: PreviewProvider {
static var previews: some View {
ContentItem(
contentData: ModelData().contentItems[0]
)
}
}
์ ์์์์ ๋ณด๋ฉด ์ฌ์ง ์์ ํ ์คํธ๊ฐ ์ค๋ฒ๋ฉ ๋์ด ์๋ค. ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ZStack์ ์ฌ์ฉํ์ฌ ์ค๋ฒ๋ฉ์ ์ฌ์ฉํ์๋ค.
ํ ์คํธ ๋ชฉ๋ก ๊ตฌํ
ํ์ฌ๊น์ง ๋ง๋ ์ฝํ ์ธ Element ์ ์์ธ ํ๋ฉด์ ์ฐ๊ฒฐํ๋ ๋ชฉ๋ก ํ๋ฉด์ ๊ตฌํํด์ผ ํ๋ค.

์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
import SwiftUI
struct ContentRow: View {
var contentList: [ContentDetailData]
var body: some View {
VStack(alignment: .leading){
Text("# ์ถ์ฒ์ฝํ
์ธ ")
.font(.headline)
.bold()
.padding(.leading, 20)
.padding(.bottom, -8)
.padding(.top, 10)
ScrollView(.horizontal, showsIndicators: false){
HStack(alignment: .top, spacing: 0){
ForEach(contentList) { item in
NavigationLink{
ContentDetail(contItem: item)
} label: {
ContentItem(contentData: item)
}
}
}
}
}
}
}
struct ContentRow_Previews: PreviewProvider {
static var previews: some View {
ContentRow(contentList: ModelData().contentItems)
}
}
์ถ์ฒ ์ฝํ ์ธ ์์ ๋ณด์ฌ์ค ์ฝํ ์ธ ์ ๋ชฉ๋ก์ ๋ช๊ฐ๊ฐ ๋ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ScrollView ๋ก ๊ตฌํํ๋ค. ContentDetail ๋๋ ContentItem์ ๋๊ธฐ๋ ๋ฐ์ดํฐ๋ ์์์ ์ค๋ช ํ๋ ContentDetailData ๋ฅผ ์ฌ์ฉํ์๋ค.
๊ตฌํ ์ฒซ๋ฒ์งธ๋ก ํ ์คํธ ์ฝํ ์ธ ๋ชฉ๋ก๊ณผ ์ด๋ฅผ ๋ณด์ฌ์ค ์ ์๋ ๋ผ๋ฒจ, ๊ทธ๋ฆฌ๊ณ ์์ธ ํ์ด์ง ๊น์ง ๊ตฌํํ์๋ค.
๋ค์์๋ ์ฑํ ๋ฐฉ UI ๋ฅผ ๊ตฌํํด๋ณด์.
'IOS(Swift)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[IOS/Swift] MBTI ์นด๋ ์ ํ ๊ฒ์ UI ๊ตฌํ (0) | 2022.05.22 |
---|---|
[IOS/Swift] ์ฝํ ์ธ ๊ฒ์ ์ฑ ๊ตฌํ - 4. ๋ก๊ทธ์ธ UI ๊ตฌํ (0) | 2022.04.04 |
[IOS/Swift] ์ฝํ ์ธ ๊ฒ์ ์ฑ ๊ตฌํ - 3. ํ์๊ฐ์ UI ๊ตฌํ (0) | 2022.04.04 |
[IOS/Swift] ์ฝํ ์ธ ๊ฒ์ ์ฑ ๊ตฌํ - 2. ์ฑํ ๋ฐฉ UI ๊ตฌํ (0) | 2022.03.05 |