[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
.onTapGesturevàoAsyncImage. - Trong closure, tạo
ImageRenderertừAsyncImage. - Chuyển đổi
SwiftUI.ImagethànhUIImagebằngrenderer.uiImage. Sử dụng?? UIImage()để tránh nil. - Gán giá trị
UIImagevào biếnuiImage. - Gọi
showPhotoViewer.toggle()để hiển thị sheet.
- Thêm
- Hiển thị Sheet:
- Thêm
.sheetdướiScrollViewvới biếnisPresentedlàshowPhotoViewer. - Trong closure
content, gọiPhotoViewvà truyềnuiImagevà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 photobằ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
photoViewbằng sheet:- Thay vì truyền trực tiếp
uiImagevàspot, chúng ta truyền thêmphoto - Sử dụng
$newPhotođể binding với biếnphototrongPhotoView.
- 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
$selectedPhotonhư một binding.
- Tạo
- Sửa SpotViewModel:
- Trong hàm
saveImage, thay đổilet photoNamethànhvar photoName. - Kiểm tra
photo.idcó null không. Nếu không:- Gán
photoNamebằngphoto.id!để giữ nguyên ID khi update.
- Gán
- Nếu không, tạo mới
photoNamebằng UUID.
- Trong hàm
- Sửa lỗi scale ảnh: Chuyển modifier
scaleToFilllên trước modifierframe
Chúc bạn thực hành thành công!
