Skip to content

Commit

Permalink
Copy FixedSize to DynamicSize folder
Browse files Browse the repository at this point in the history
  • Loading branch information
djeni98 committed Jan 19, 2024
1 parent 2ca48fb commit 2a65b68
Show file tree
Hide file tree
Showing 6 changed files with 207 additions and 0 deletions.
28 changes: 28 additions & 0 deletions Virtual Crop.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@
B7B466C22B5A8C300082BE83 /* EditImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7B466C12B5A8C300082BE83 /* EditImageView.swift */; };
B7B466C42B5A8EEA0082BE83 /* ImageInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7B466C32B5A8EEA0082BE83 /* ImageInfo.swift */; };
B7B466C72B5A9E090082BE83 /* ImageVisualizerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7B466C62B5A9E090082BE83 /* ImageVisualizerView.swift */; };
B7B466CE2B5AA9AF0082BE83 /* DSNewImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7B466C92B5AA9AF0082BE83 /* DSNewImageView.swift */; };
B7B466CF2B5AA9AF0082BE83 /* DSEditImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7B466CA2B5AA9AF0082BE83 /* DSEditImageView.swift */; };
B7B466D02B5AA9AF0082BE83 /* DSHomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7B466CB2B5AA9AF0082BE83 /* DSHomeView.swift */; };
B7B466D12B5AA9AF0082BE83 /* DSImageInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7B466CC2B5AA9AF0082BE83 /* DSImageInfo.swift */; };
B7B466D22B5AA9AF0082BE83 /* DSImageVisualizerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7B466CD2B5AA9AF0082BE83 /* DSImageVisualizerView.swift */; };
B7B6A65E2B1F6FF3002FB3EB /* Virtual_CropApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7B6A65D2B1F6FF3002FB3EB /* Virtual_CropApp.swift */; };
B7B6A6602B1F6FF3002FB3EB /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7B6A65F2B1F6FF3002FB3EB /* ContentView.swift */; };
B7B6A6622B1F6FF4002FB3EB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B7B6A6612B1F6FF4002FB3EB /* Assets.xcassets */; };
Expand All @@ -24,6 +29,11 @@
B7B466C12B5A8C300082BE83 /* EditImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditImageView.swift; sourceTree = "<group>"; };
B7B466C32B5A8EEA0082BE83 /* ImageInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageInfo.swift; sourceTree = "<group>"; };
B7B466C62B5A9E090082BE83 /* ImageVisualizerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageVisualizerView.swift; sourceTree = "<group>"; };
B7B466C92B5AA9AF0082BE83 /* DSNewImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSNewImageView.swift; sourceTree = "<group>"; };
B7B466CA2B5AA9AF0082BE83 /* DSEditImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSEditImageView.swift; sourceTree = "<group>"; };
B7B466CB2B5AA9AF0082BE83 /* DSHomeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSHomeView.swift; sourceTree = "<group>"; };
B7B466CC2B5AA9AF0082BE83 /* DSImageInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSImageInfo.swift; sourceTree = "<group>"; };
B7B466CD2B5AA9AF0082BE83 /* DSImageVisualizerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSImageVisualizerView.swift; sourceTree = "<group>"; };
B7B6A65A2B1F6FF3002FB3EB /* Virtual Crop.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Virtual Crop.app"; sourceTree = BUILT_PRODUCTS_DIR; };
B7B6A65D2B1F6FF3002FB3EB /* Virtual_CropApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Virtual_CropApp.swift; sourceTree = "<group>"; };
B7B6A65F2B1F6FF3002FB3EB /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
Expand All @@ -46,6 +56,18 @@
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
B7B466C82B5AA9AF0082BE83 /* DynamicSize */ = {
isa = PBXGroup;
children = (
B7B466C92B5AA9AF0082BE83 /* DSNewImageView.swift */,
B7B466CA2B5AA9AF0082BE83 /* DSEditImageView.swift */,
B7B466CB2B5AA9AF0082BE83 /* DSHomeView.swift */,
B7B466CC2B5AA9AF0082BE83 /* DSImageInfo.swift */,
B7B466CD2B5AA9AF0082BE83 /* DSImageVisualizerView.swift */,
);
path = DynamicSize;
sourceTree = "<group>";
};
B7B6A6512B1F6FF2002FB3EB = {
isa = PBXGroup;
children = (
Expand All @@ -69,6 +91,7 @@
B7B6A65F2B1F6FF3002FB3EB /* ContentView.swift */,
B7DC14FA2B58546600E15AA2 /* CropperEditorView.swift */,
B7F6ADD42B594CDB00879C2D /* VisualizerAndCropperEditorView.swift */,
B7B466C82B5AA9AF0082BE83 /* DynamicSize */,
B7F6ADD62B59ACE200879C2D /* FixedSize */,
B7B6A6612B1F6FF4002FB3EB /* Assets.xcassets */,
B7B6A6632B1F6FF4002FB3EB /* Preview Content */,
Expand Down Expand Up @@ -166,13 +189,18 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B7B466D22B5AA9AF0082BE83 /* DSImageVisualizerView.swift in Sources */,
B7DC14FB2B58546600E15AA2 /* CropperEditorView.swift in Sources */,
B7B466CE2B5AA9AF0082BE83 /* DSNewImageView.swift in Sources */,
B7B466C42B5A8EEA0082BE83 /* ImageInfo.swift in Sources */,
B7F6ADD52B594CDB00879C2D /* VisualizerAndCropperEditorView.swift in Sources */,
B7B466CF2B5AA9AF0082BE83 /* DSEditImageView.swift in Sources */,
B7B6A6602B1F6FF3002FB3EB /* ContentView.swift in Sources */,
B7F6ADD82B59AD1400879C2D /* HomeView.swift in Sources */,
B7B466D12B5AA9AF0082BE83 /* DSImageInfo.swift in Sources */,
B7B466C22B5A8C300082BE83 /* EditImageView.swift in Sources */,
B7F6ADDA2B59B25700879C2D /* NewImageView.swift in Sources */,
B7B466D02B5AA9AF0082BE83 /* DSHomeView.swift in Sources */,
B7B6A65E2B1F6FF3002FB3EB /* Virtual_CropApp.swift in Sources */,
B7B466C72B5A9E090082BE83 /* ImageVisualizerView.swift in Sources */,
);
Expand Down
53 changes: 53 additions & 0 deletions Virtual Crop/DynamicSize/DSEditImageView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import SwiftUI

extension DynamicSizeImageInfo {
func toEditorInput() -> CropperEditorView.Input {
return .init(uiimage: uiimage, scale: scale, offset: offset)
}
}

struct DynamicSizeEditImageView: View {
let info: DynamicSizeImageInfo
@Binding var allImages: [DynamicSizeImageInfo]

@Environment(\.dismiss) private var dismiss
@State private var output = CropperEditorView.Output(scale: 1, offset: .zero)

private var size: CGSize { DynamicSizeHomeView.cropSize }

var body: some View {
ZStack {
CropperEditorView(input: info.toEditorInput(), output: $output)
Circle().stroke()
.frame(width: size.width, height: size.width)
}
.ignoresSafeArea()
.navigationTitle("Edit Image")
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Save", action: save)
}
}
}

func save() {
guard let index = allImages.firstIndex(where: { $0.id == info.id }) else {
return
}

allImages[index].scale = output.scale
allImages[index].offset = output.offset

dismiss()
}
}

#Preview {
NavigationStack {
DynamicSizeEditImageView(
info: .init(uiimage: UIImage(named: "cachorro")!),
allImages: .constant([])
)
}
}
49 changes: 49 additions & 0 deletions Virtual Crop/DynamicSize/DSHomeView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import SwiftUI

struct DynamicSizeHomeView: View {
static let cropSize = CGSize(width: 200, height: 200)

private let columns = [GridItem(), GridItem(), GridItem()]
private var size: CGSize { DynamicSizeHomeView.cropSize }

@State private var imagesInfo = [
DynamicSizeImageInfo(uiimage: UIImage(named: "image-900-500")!,
scale: nil,
offset: nil)
]

var body: some View {
NavigationStack {
ScrollView {
LazyVGrid(columns: columns, spacing: 40) {
ForEach(imagesInfo) { info in
let destination = DynamicSizeEditImageView(info: info, allImages: $imagesInfo)
NavigationLink(destination: destination) {
DynamicSizeImageVisualizerView(imageInfo: info)
}
}

NavigationLink(destination: DynamicSizeNewImageView(allImages: $imagesInfo)) {
buttonAdd
}

}
}
.navigationTitle("Fixed Size Example")
}
}

var buttonAdd: some View {
Circle().stroke().overlay {
HStack {
Image(systemName: "plus")
Text("Add")
}
}
.frame(width: size.width, height: size.height)
}
}

#Preview {
DynamicSizeHomeView()
}
8 changes: 8 additions & 0 deletions Virtual Crop/DynamicSize/DSImageInfo.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import SwiftUI

struct DynamicSizeImageInfo: Identifiable {
let id = UUID()
let uiimage: UIImage
var scale: CGFloat?
var offset: CGSize?
}
22 changes: 22 additions & 0 deletions Virtual Crop/DynamicSize/DSImageVisualizerView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import SwiftUI

struct DynamicSizeImageVisualizerView: View {
let imageInfo: DynamicSizeImageInfo
private var size: CGSize { DynamicSizeHomeView.cropSize }

var body: some View {
Image(uiImage: imageInfo.uiimage)
.scaleEffect(imageInfo.scale ?? 1)
.offset(imageInfo.offset ?? .zero)
.frame(width: size.width, height: size.height)
.clipShape(Circle())
.contentShape(Circle())
}
}

#Preview {
DynamicSizeImageVisualizerView(
imageInfo: .init(uiimage: UIImage(named:"image-900-500")!,
scale: nil, offset: nil)
)
}
47 changes: 47 additions & 0 deletions Virtual Crop/DynamicSize/DSNewImageView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import SwiftUI

struct DynamicSizeNewImageView: View {
@Binding var allImages: [DynamicSizeImageInfo]

@Environment(\.dismiss) private var dismiss
@State private var imageName = "cachorro"
@State private var output = CropperEditorView.Output(scale: 1, offset: .zero)

private var size: CGSize { DynamicSizeHomeView.cropSize }
private var uiimage: UIImage { UIImage(named: imageName)! }

var body: some View {
ZStack {
CropperEditorView(input: .from(uiimage), output: $output)
Circle().stroke()
.frame(width: size.width, height: size.width)
}
.ignoresSafeArea()
.navigationTitle("New Image")
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .bottomBar) {
Button("Change Image") {
imageName = imageName == "cachorro" ? "image-900-500" : "cachorro"
}
}

ToolbarItem(placement: .navigationBarTrailing) {
Button("Save", action: save)
}
}
}

func save() {
allImages.append(.init(uiimage: uiimage,
scale: output.scale,
offset: output.offset))

dismiss()
}
}
#Preview {
NavigationStack {
DynamicSizeNewImageView(allImages: .constant([]))
}
}

0 comments on commit 2a65b68

Please sign in to comment.