New in SwiftUI 3: SafeAreaInset in SwiftUI 3 and iOS 15
DevTechie Inc
DevTechie Inc
Apr 6, 2022
Another new feature introduced in SwiftUI 3 is safeAreaInset(edge:alignment:spacing:content:) . It provides a way for views to show view beside the modified view.
Last sentence made me dizzy đ”âđ« so letâs look at an example.
In this example, we will take another look at DevTechie Course app where our home page displays courses from DevTechie(again thatâs me đ)
Letâs quickly add model:
struct DevTechieCourse: Identifiable {
var id = UUID()
var name: String
var chapters: Int
}
Sample data
extension DevTechieCourse {
static var sampleData: [DevTechieCourse] {
[
DevTechieCourse(name: "Machine Learning in iOS", chapters: 10),
DevTechieCourse(name: "CollectionViews in iOS", chapters: 12),
DevTechieCourse(name: "SwiftUI DeepDive", chapters: 14),
DevTechieCourse(name: "Goals App in SwiftUI", chapters: 16),
DevTechieCourse(name: "Firebase and SwiftUI", chapters: 8),
DevTechieCourse(name: "Disney Plus Clone in SwiftUI", chapters: 15),
DevTechieCourse(name: "Strava Clone in UIKit, iOS and Swift", chapters: 11),
DevTechieCourse(name: "Data Structures and Algorithms in Swift", chapters: 21),
DevTechieCourse(name: "Machine Learning in iOS", chapters: 10),
DevTechieCourse(name: "CollectionViews in iOS", chapters: 12),
DevTechieCourse(name: "SwiftUI DeepDive", chapters: 14),
DevTechieCourse(name: "Goals App in SwiftUI", chapters: 16),
DevTechieCourse(name: "Firebase and SwiftUI", chapters: 8),
DevTechieCourse(name: "Disney Plus Clone in SwiftUI", chapters: 15),
DevTechieCourse(name: "Strava Clone in UIKit, iOS and Swift", chapters: 11),
DevTechieCourse(name: "Data Structures and Algorithms in Swift", chapters: 21)
]
}
}
View model for model
struct DevTechieCourseViewModel: Identifiable {
var dtCourse: DevTechieCourse
var id: UUID {
dtCourse.id
}
var name: String {
dtCourse.name
}
var chapters: String {
String(dtCourse.chapters)
}
}
Course list view model
class DevTechieCourseListViewModel: ObservableObject {
@Published var dtCourses = [DevTechieCourseViewModel]()
func getAll() {
dtCourses = DevTechieCourse.sampleData.map(DevTechieCourseViewModel.init)
}
}
View cell
struct DevTechieCourseCell: View {
var course: DevTechieCourseViewModel
var body: some View {
VStack(alignment: .leading, spacing: 10) {
Text(course.name)
.font(.title2)
.bold()
Text("There are \(course.chapters) chapters in this course.")
.font(.subheadline)
.foregroundColor(.secondary)
}
}
}
Notice that we have âEnroll Nowâ button added as an overlay to the scrollview. All looks good until we reach the end of scrollview and then you realize that you canât really see the last row properly đČ Itâs because scrollview doesnât have idea about the button.
Letâs replace overlay with safeAreaInset and alignment parameter with edge