🔴 Let's Build Twitter with SwiftUI (iOS 15, Xcode 13, Firebase, SwiftUI 3.0)
Button {
showNewTweetView.toggle()
} label: {
Image("tweet_pencil")
.resizable()
.renderingMode(.template)
.frame(width: 28, height: 28)
.padding()
}
.background(Color(.systemBlue))
.foregroundColor(.white)
.clipShape(Circle())
.padding()
.fullScreenCover(isPresented: $showNewTweetView) {
NewTweetView()
}
ZStack(alignment: .bottomTrailing) {
ScrollView {
LazyVStack {
ForEach(0...20, id: \.self) { _ in
TweetRowView()
.padding()
}
}
}
// Button
}
bottomTrailing
으로 정렬하는 ZStack
을 통해 해당 버튼을 우측 하단 부에 위치import SwiftUI
struct NewTweetView: View {
@Environment(\.presentationMode) var mode
@State private var caption = ""
var body: some View {
VStack {
HStack {
Button {
mode.wrappedValue.dismiss()
} label: {
Text("Cancel")
.foregroundColor(Color(.systemBlue))
}
Spacer()
Button {
print("Tweet")
} label: {
Text("Tweet")
.bold()
.padding(.horizontal)
.padding(.vertical, 8)
.background(Color(.systemBlue))
.foregroundColor(.white)
.clipShape(Capsule())
}
}
.padding()
HStack(alignment: .top) {
Circle()
.frame(width: 64, height: 64)
TextArea("What's happening?", text: $caption)
}
.padding()
Spacer()
}
}
}
import SwiftUI
struct FeedView: View {
@State private var showNewTweetView: Bool = false
var body: some View {
ZStack(alignment: .bottomTrailing) {
ScrollView {
LazyVStack {
ForEach(0...20, id: \.self) { _ in
TweetRowView()
.padding()
}
}
}
Button {
showNewTweetView.toggle()
} label: {
Image("tweet_pencil")
.resizable()
.renderingMode(.template)
.frame(width: 28, height: 28)
.padding()
}
.background(Color(.systemBlue))
.foregroundColor(.white)
.clipShape(Circle())
.padding()
.fullScreenCover(isPresented: $showNewTweetView) {
NewTweetView()
}
}
}
}
import SwiftUI
struct TextArea: View {
@Binding var text: String
let placeholder: String
init(_ placeholder: String, text: Binding<String>) {
self.placeholder = placeholder
self._text = text
UITextView.appearance().backgroundColor = .clear
}
var body: some View {
ZStack(alignment: .topLeading) {
TextField(placeholder, text: $text, axis: .vertical)
.padding(4)
}
.font(.body)
}
}