![](/img/trans.png)
[英]Animation in ScrollView is missing the last object in SwiftUI
[英]Apply sepiaTone to photos in swiftui into scrollview object
下面的 swiftui 代碼應將 sephia.tone 過濾器應用於當前照片,為此我使用了下面的代碼但未應用過濾器,誰能向我解釋問題出在哪里? 當我點擊棕褐色時,我調用了應用 CiFilter 的 function,這是因為什么? 因為過濾器沒有正確應用
Swift 用戶界面代碼:
import SwiftUI
import CoreImage
import CoreImage.CIFilterBuiltins
//BoxImage filter ui
struct BoxImage{
var id:Int
let title,imageurl:String
}
//BoxView filter ui
struct BoxView:View{
let box:BoxImage
var body: some View{
VStack{
Image("\(box.imageurl)").resizable().cornerRadius(12).frame(width: 80, height: 80 )
Text(box.title).font(.subheadline).fontWeight(/*@START_MENU_TOKEN@*/.bold/*@END_MENU_TOKEN@*/)
}
}
}
struct FilterUiView: View {
//Setup filter
@State private var currentFilter = CIFilter.sepiaTone()
let context = CIContext()
@Environment(\.presentationMode) var mode: Binding<PresentationMode>
@State var imageselected:Image=Image("Geometry")
@State var showImagePicker: Bool = false
@State private var showingSheet = false
func applyProcessing() {
guard let outputImage = currentFilter.outputImage else { return }
if let cgimg = context.createCGImage(outputImage, from: outputImage.extent) {
let uiImage = UIImage(cgImage: cgimg)
self.imageselected = Image(uiImage: uiImage)
print("Tono seppia")
}
print("processo tono seppia")
}
var body: some View {
VStack {
Text("Filter")
.font(.system(size: 25, weight: .bold, design: .serif))
.foregroundColor(Color(#colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1)))
.padding(.top, 5)
Spacer()
Spacer()
Spacer()
VStack{
imageselected
.resizable()
.aspectRatio(contentMode: .fit)
.cornerRadius(10)
.overlay(RoundedRectangle(cornerRadius: 10)
.stroke(Color.green, lineWidth: 4))
.shadow(radius: 10).onTapGesture {
self.showImagePicker.toggle()
}
}.sheet(isPresented: $showImagePicker) {
ImagePicker(sourceType: .photoLibrary) { image in
self.imageselected = Image(uiImage: image)
}
}
Spacer()
Spacer()
Spacer()
VStack {
ScrollView(.horizontal){
HStack(spacing: 20) {
BoxView(box: BoxImage(id: 0, title: "Sepia", imageurl: "sepia")).onTapGesture {
applyProcessing()
}
BoxView(box: BoxImage(id: 1, title: "Model", imageurl: "Abstract"))
BoxView(box: BoxImage(id: 2,title: "Modify ui",imageurl: "Aj"))
BoxView(box: BoxImage(id: 4,title: "Modify ui",imageurl: "Aj"))
BoxView(box: BoxImage(id: 5,title: "Modify2i",imageurl: "Aj"))
BoxView(box: BoxImage(id: 6,title: "Modify2i",imageurl: "Aj"))
}
}
}
}.background(Color.white).navigationBarHidden(true)
}
}
您需要為過濾器設置輸入圖像並注意Image
和UImage
之間的互操作
import SwiftUI
import CoreImage
import CoreImage.CIFilterBuiltins
//BoxImage filter ui
struct BoxImage{
var id:Int
let title,imageurl:String
}
//BoxView filter ui
struct BoxView:View{
let box:BoxImage
var body: some View{
VStack{
Image("\(box.imageurl)").resizable().cornerRadius(12).frame(width: 80, height: 80 )
Text(box.title).font(.subheadline).fontWeight(/*@START_MENU_TOKEN@*/.bold/*@END_MENU_TOKEN@*/)
}
}
}
struct FilterUiView: View {
//Setup filter
@State private var currentFilter = CIFilter.sepiaTone()
let context = CIContext()
@Environment(\.presentationMode) var mode: Binding<PresentationMode>
@State var imageselected:UIImage?
@State var showImagePicker: Bool = false
@State private var showingSheet = false
func applyProcessing() {
guard let cgimg = imageselected?.cgImage else {
print("imageView doesn't have an image!")
return
}
let coreImage = CIImage(cgImage: cgimg)
currentFilter.setValue(coreImage, forKey: kCIInputImageKey)
guard let outputImage = currentFilter.outputImage else { return }
if let cgimg = context.createCGImage(outputImage, from: outputImage.extent) {
let uiImage = UIImage(cgImage: cgimg)
self.imageselected = uiImage
print("Tono seppia")
}
print("processo tono seppia")
}
var body: some View {
VStack {
Text("Filter")
.font(.system(size: 25, weight: .bold, design: .serif))
.foregroundColor(Color(#colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1)))
.padding(.top, 5)
Spacer()
Spacer()
Spacer()
VStack{
if imageselected == nil {
Image("Geometry")
.resizable()
.aspectRatio(contentMode: .fit)
.cornerRadius(10)
.overlay(RoundedRectangle(cornerRadius: 10)
.stroke(Color.green, lineWidth: 4))
.shadow(radius: 10).onTapGesture {
self.showImagePicker.toggle()
}
}
else {
Image(uiImage: imageselected! )
.resizable()
.aspectRatio(contentMode: .fit)
.cornerRadius(10)
.overlay(RoundedRectangle(cornerRadius: 10)
.stroke(Color.green, lineWidth: 4))
.shadow(radius: 10).onTapGesture {
self.showImagePicker.toggle()
}
}
}.sheet(isPresented: $showImagePicker) {
ImagePicker(sourceType: .photoLibrary) { image in
self.imageselected = image
}
}
Spacer()
Spacer()
Spacer()
VStack {
ScrollView(.horizontal){
HStack(spacing: 20) {
BoxView(box: BoxImage(id: 0, title: "Sepia", imageurl: "sepia")).onTapGesture {
applyProcessing()
}
BoxView(box: BoxImage(id: 1, title: "Model", imageurl: "Abstract"))
BoxView(box: BoxImage(id: 2,title: "Modify ui",imageurl: "Aj"))
BoxView(box: BoxImage(id: 4,title: "Modify ui",imageurl: "Aj"))
BoxView(box: BoxImage(id: 5,title: "Modify2i",imageurl: "Aj"))
BoxView(box: BoxImage(id: 6,title: "Modify2i",imageurl: "Aj"))
}
}
}
}.background(Color.white).navigationBarHidden(true)
}
}
public struct ImagePicker: UIViewControllerRepresentable {
private let sourceType: UIImagePickerController.SourceType
private let onImagePicked: (UIImage) -> Void
@Environment(\.presentationMode) private var presentationMode
public init(sourceType: UIImagePickerController.SourceType, onImagePicked: @escaping (UIImage) -> Void) {
self.sourceType = sourceType
self.onImagePicked = onImagePicked
}
public func makeUIViewController(context: Context) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.sourceType = self.sourceType
picker.delegate = context.coordinator
return picker
}
public func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {}
public func makeCoordinator() -> Coordinator {
Coordinator(
onDismiss: { self.presentationMode.wrappedValue.dismiss() },
onImagePicked: self.onImagePicked
)
}
final public class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
private let onDismiss: () -> Void
private let onImagePicked: (UIImage) -> Void
init(onDismiss: @escaping () -> Void, onImagePicked: @escaping (UIImage) -> Void) {
self.onDismiss = onDismiss
self.onImagePicked = onImagePicked
}
public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
if let image = info[.originalImage] as? UIImage {
self.onImagePicked(image)
}
self.onDismiss()
}
public func imagePickerControllerDidCancel(_: UIImagePickerController) {
self.onDismiss()
}
}
}
前
后
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.