Browse Source

Photos

master
marcoschmickler 4 years ago
parent
commit
36a21cef01
  1. 116
      kplayer/photo/SPhotoView.swift

116
kplayer/photo/SPhotoView.swift

@ -10,10 +10,10 @@ struct SPhotoView : View {
var completionHandler: ((Bool) -> Void)?
@ObservedObject
var model: SPhotoModel
@State
var update = false
@State var scrub = false
@State var scale: CGFloat = 1.0
@State var lastScaleValue: CGFloat = 1.0
@State var proxy: GeometryProxy?
var body: some View {
VStack {
@ -23,55 +23,85 @@ struct SPhotoView : View {
completionHandler!(true)
}, label: {
Text("cancel")
}).foregroundColor(update ? Color.yellow : Color.blue)
})//.foregroundColor(update ? Color.yellow : Color.blue)
.buttonStyle(BorderlessButtonStyle())
Spacer()
}
}.frame(height: 50)
// AsyncImage(item: model.selectedItem, thumb: false, placeholder: { Text("Loading ...") }, image: { Image(uiImage: $0).resizable() })
SwiftUI.AsyncImage(url: URL(string: model.selectedItem.imageUrlAbsolute)){ image in
image //.resizable();//.scaledToFit()
}
placeholder: {
if let i = model.selectedItem.thumbImage {
Image(uiImage: i)
}
else {
ProgressView()
}
}.scaleEffect(scale)
.gesture(MagnificationGesture()
.onChanged { val in
let delta = val / self.lastScaleValue
self.lastScaleValue = val
scale = self.scale * delta
GeometryReader { geo in
// AsyncImage(item: model.selectedItem, thumb: false, placeholder: { Text("Loading ...") }, image: { Image(uiImage: $0).resizable() })
SwiftUI.AsyncImage(url: URL(string: model.allItems[model.index].imageUrlAbsolute)) { image in
image.resizable().scaledToFill()
}
placeholder: {
if let i = model.selectedItem.thumbImage {
Image(uiImage: i) .resizable().scaledToFill()
} else {
ProgressView()
}
}.frame(height: geo.size.height - 120)
.scaleEffect(scale)
.gesture(MagnificationGesture()
.onChanged { val in
let delta = val / self.lastScaleValue
self.lastScaleValue = val
scale = self.scale * delta
//... anything else e.g. clamping the newScale
}.onEnded { val in
// without this the next gesture will be broken
self.lastScaleValue = 1.0
})
.contentShape(Rectangle()).clipped();
}
.onEnded { val in
// without this the next gesture will be broken
self.lastScaleValue = 1.0
})
if scale <= 1.0 {
GeometryReader { geometry in
HStack {
ForEach(model.indexItems) { item in
AsyncImage(item: item, placeholder: { Text("Loading ...") },
image: { Image(uiImage: $0).resizable() })
}
.frame(height: 70)
}.onAppear() {
proxy = geometry
}
.gesture(
DragGesture()
.onChanged { gesture in
let dragged = gesture.translation
ScrollView(.horizontal, showsIndicators: false) {
HStack {
ForEach(model.allItems) { item in
Button(action: {
gotoSnapshot(item)
}, label: {
AsyncImage(item: item, placeholder: { Text("Loading ...") },
image: { Image(uiImage: $0).resizable() })
}).buttonStyle(BorderlessButtonStyle())
}.frame(height: 70)
}
}
}
}
let xpos = Double(gesture.startLocation.x + dragged.width)
let width = Double(proxy!.size.width - 30)
let i = Int(Double(model.allItems.count - 1) * (xpos / width))
if (i < model.allItems.count) {
model.thumbIndex = i
}
print("size \(width) xpos \(xpos) i \(i)")
func gotoSnapshot(_ item: MediaItem) {
model.selectedItem = item
update.toggle()
scrub = true
}
.onEnded { gesture in
let xpos = gesture.predictedEndLocation.x
let width = Double(proxy!.size.width - 30)
print("select \(model.selectedItem.imageUrlAbsolute)")
let i = Int(Double(model.allItems.count - 1) * (xpos / width))
if (i < model.allItems.count) {
model.index = i
}
scrub = false
print("size \(width) xpos \(xpos) i \(i)")
}
)
}.overlay(
(model.allItems[model.thumbIndex].thumbImage != nil) ? Image(uiImage: model.allItems[model.thumbIndex].thumbImage!).frame(width: 200, height: 200, alignment: .top).offset(x: 0, y: -150) : nil)
}
}.contentShape(Rectangle()).clipped();
}
}
}
Loading…
Cancel
Save