[Video Summary] Ch. 8.20 Click to Display or Edit an Image from a SwiftUI Horizontal Scroll View (Snacktacular app)
Mô tả nhanh
Video này hướng dẫn cách thêm chức năng click vào ảnh trong scroll view ngang để mở ảnh ở chế độ toàn màn hình và chỉnh sửa mô tả (nếu là ảnh của người dùng hiện tại).
Video
Mô tả chi tiết
Video này hướng dẫn cách thêm chức năng click vào ảnh trong scroll view ngang để mở ảnh ở chế độ toàn màn hình và chỉnh sửa mô tả (nếu là ảnh của người dùng hiện tại).
Các bước chi tiết:
- Thêm State Variable và UI Image:
- Tạo
@State private var showPhotoViewer
để hiển thị sheet chứa ảnh. - Tạo
@State private var uiImage
để lưu ảnh kiểuUIImage
(chuyển từSwiftUI.Image
).
- Tạo
- Bắt sự kiện Tap và chuyển đổi ảnh:
- Thêm
.onTapGesture
vàoAsyncImage
. - Trong closure, tạo
ImageRenderer
từAsyncImage
. - Chuyển đổi
SwiftUI.Image
thànhUIImage
bằngrenderer.uiImage
. Sử dụng?? UIImage()
để tránh nil. - Gán giá trị
UIImage
vào biếnuiImage
. - Gọi
showPhotoViewer.toggle()
để hiển thị sheet.
- Thêm
- Hiển thị Sheet:
- Thêm
.sheet
dướiScrollView
với biếnisPresented
làshowPhotoViewer
. - Trong closure
content
, gọiPhotoView
và truyềnuiImage
vàspot
.
- Thêm
- Căn chỉnh Progress View:
- Thêm modifier
.frame(width: 80, height: 80)
choProgressView
để căn giữa.
- Thêm modifier
- Sửa Photo View:
- Import
Firebase
để lấy thông tin người dùng. - Kiểm tra email người dùng hiện tại với email người đăng ảnh.
- Nếu là người đăng ảnh:
- Hiển thị nút "Cancel" và "Save".
- Nếu không phải người đăng ảnh:
- Hiển thị nút "Done".
- Vô hiệu hóa text field chỉnh sửa mô tả.
- Thay
@State var photo
bằng@Binding var photo
để có thể truyền dữ liệu từ view ngoài. - Sửa lại PreviewProvider của
PhotoView
để phù hợp với việc binding.
- Import
- Sửa SpotDetailView:
- Tạo
@State var newPhoto
để lưu trữ photo mới. - Ở chỗ gọi
photoView
bằng sheet:- Thay vì truyền trực tiếp
uiImage
vàspot
, chúng ta truyền thêmphoto
- Sử dụng
$newPhoto
để binding với biếnphoto
trongPhotoView
.
- Thay vì truyền trực tiếp
- Thêm vào on change modifier của photo picker một dòng code
newPhoto = Photo()
để clear dữ liệu mô tả của lần chọn trước.
- Tạo
- Sửa SpotDetailPhotoScrollView:
- Tạo
@State var selectedPhoto
để lưu trữ photo được chọn. - Trong
.onTapGesture
, gánselectedPhoto = photo
(photo của item được chọn). - Trong sheet, truyền
$selectedPhoto
như một binding.
- Tạo
- Sửa SpotViewModel:
- Trong hàm
saveImage
, thay đổilet photoName
thànhvar photoName
. - Kiểm tra
photo.id
có null không. Nếu không:- Gán
photoName
bằngphoto.id!
để giữ nguyên ID khi update.
- Gán
- Nếu không, tạo mới
photoName
bằng UUID.
- Trong hàm
- Sửa lỗi scale ảnh: Chuyển modifier
scaleToFill
lên trước modifierframe
Chúc bạn thực hành thành công!