Coder Social home page Coder Social logo

anyimagekit / anyimagekit Goto Github PK

View Code? Open in Web Editor NEW
723.0 21.0 99.0 7.09 MB

A toolbox for pick/edit/capture photo or video. Written in Swift.

License: MIT License

Objective-C 0.06% Swift 99.94%
uiimagepickercontroller gif video ios swift5 multiple-photos editor drawing crop-image capture

anyimagekit's Introduction

AnyImageKit

GitHub Actions CocoaPods Compatible Platform License

AnyImageKit is a toolbox for picking, editing or capturing photos/videos, written in Swift.

中文说明

Features

  • Modular design
    • Picker
    • Browser
    • Editor
    • Capture
  • Light mode, dark mode or auto mode support
  • Default theme is similar with Wechat
  • Multiple & mix select support
  • Supported media types:
    • Photo
    • GIF
    • Live Photo
    • Video
  • Camera
    • Photo
    • Video
    • Live Photo
    • GIF
    • Filter Support
  • Edit image ( Technical Preview )
    • Drawing
    • Emoji
    • Input text
    • Cropping
    • Mosaic
    • Rotate
    • Filter Support
  • Multiple platform support
    • iOS
    • iPadOS
    • Mac Catalyst ( Technical Preview, Not support in editor.)
    • macOS
    • tvOS
  • Internationalization support
    • English (en)
    • Chinese, Simplified (zh-Hans)
    • Turkish (tr)
    • Portuguese(Brazil) (pt-BR)
    • and more... (Pull requests welcome)

Requirements

  • iOS 12.0+
  • Xcode 14.1+
  • Swift 5.7+

Installation

⚠️ Needs Xcode 12.0+ to support resources and localization files

dependencies: [
    .package(url: "https://github.com/AnyImageKit/AnyImageKit.git", .upToNextMajor(from: "0.15.1"))
]

Add this to Podfile, and then update dependency:

pod 'AnyImageKit'

Usage

Prepare

Add these keys to your Info.plist when needed:

Key Module Info
NSPhotoLibraryUsageDescription Picker
NSPhotoLibraryAddUsageDescription Picker
PHPhotoLibraryPreventAutomaticLimitedAccessAlert Picker Set YES to prevent automatic limited access alert in iOS 14+ (Picker has been adapted with Limited features that can be triggered by the user to enhance the user experience)
NSCameraUsageDescription Capture
NSMicrophoneUsageDescription Capture

Quick Start

import AnyImageKit

class ViewController: UIViewController {

    @IBAction private func openPicker(_ sender: UIButton) {
        var options = PickerOptionsInfo()
        /*
          Your code, handle custom options
        */
        let controller = ImagePickerController(options: options, delegate: self)
        present(controller, animated: true, completion: nil)
    }
}

extension ViewController: ImagePickerControllerDelegate {

    func imagePickerDidCancel(_ picker: ImagePickerController) {
        /*
          Your code, handle user cancel
        */
        picker.dismiss(animated: true, completion: nil)
    }
    
    func imagePicker(_ picker: ImagePickerController, didFinishPicking result: PickerResult) {
        let images = result.assets.map { $0.image }
        /*
          Your code, handle selected assets
        */
        picker.dismiss(animated: true, completion: nil)
    }
}

Release Notes

Latest version

Version Release Date Xcode Swift iOS
v0.17.2 2024-01-24 15.2 5.9 12.0+
History version
Version Release Date Xcode Swift iOS
v0.17.1 2024-01-12 15.2 5.9 12.0+
v0.17.0 2023-10-18 15.0 5.9 12.0+
v0.16.0 2023-05-09 14.3 5.8 12.0+
v0.15.1 2022-12-15 14.1 5.7 12.0+
v0.15.0 2022-11-11 14.1 5.7 12.0+
v0.14.6 2022-07-06 13.4.1 5.6 13.0+
v0.14.5 2022-07-05 13.4.1 5.6 13.0+
v0.14.4 2022-04-06 13.3 5.5 12.0+
v0.14.3 2021-12-28 13.2 5.5 12.0+
v0.14.2 2021-12-16 13.2 5.5 12.0+
v0.14.1 2021-11-23 13.1 5.5 12.0+
v0.14.0 2021-11-22 13.1 5.5 12.0+
v0.13.5 2021-10-15 13.0 5.5 12.0+
v0.13.4 2021-09-23 13.0 5.5 12.0+
v0.13.3 2021-08-09 12.5 5.4 10.0+
v0.13.2 2021-06-30 12.5 5.4 10.0+
v0.13.1 2021-06-01 12.5 5.4 10.0+
v0.13.0 2021-02-08 12.4 5.3 10.0+
v0.12.0 2020-12-30 12.2 5.3 10.0+
v0.11.0 2020-12-18 12.2 5.3 10.0+
v0.10.0 2020-11-03 12.1 5.3 10.0+
v0.9.0 2020-10-09 12.0 5.3 10.0+

License

AnyImageKit is released under the MIT license. See LICENSE for details.

anyimagekit's People

Contributors

anotheren avatar cdoky avatar hamzaozturk avatar hngouveia01 avatar linhay avatar mlch911 avatar noppefoxwolf avatar rayjiang16 avatar woxtu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

anyimagekit's Issues

视频Capture第一秒卡顿,之后正常

你做了什么?

使用image capture录制视频

你的预期是什么?

顺滑的视频

实际发生了什么?

第一秒卡顿

环境

func makeUIViewController(context: Context) -> ImageCaptureController {
var options = CaptureOptionsInfo()
options.tintColor = .fiOrange!
options.preferredPresets = [.hd1920x1080_30]
options.videoMaximumDuration = 30
options.editorPhotoOptions.tintColor = .fiOrange!
options.editorPhotoOptions.mosaicOptions = [.default, .colorful, .custom(icon: UIImage(named: DataConstants.Values.companyLogoMini), mosaic: UIImage(named: DataConstants.Values.mosaic) ?? UIImage())]
let controller = ImageCaptureController(options: options, delegate: context.coordinator)
return controller
}

AnyImageKit 版本:
Xcode 版本:12
Swift 版本:
iOS/iPadOS/macOS 版本:14.7

生成 cacheIdentifier 时候闪退

这不算一个 bug, 只支持 iOS 10 以上应该没问题, 往下支持 Int 值会在 32 位机器上爆掉

 /// 创建缓存标识符
    static private func createIdentifier() -> String {
        let timestamp = Int Date().timeIntervalSince1970*100))
        let random = (arc4random() % 8999) + 1000
        return "\(timestamp)_\(random)"
    }

既然下面都是转成 string, 不如第一步直接用 String 处理

尝试更新Picker选择数量限制

你做了什么?

func updateUIViewController(_ uiViewController: ImagePickerController, context: Context) {
    var options = PickerOptionsInfo()
    options.selectOptions = selectOption
    if selectOption == [.video] {
        options.selectLimit = 1
    } else {
        options.selectLimit = 9
    }
    uiViewController.update(options: options)
}

尝试更新选择数量限制

你的预期是什么?

只能选择一个视频

实际发生了什么?

还是可以选择9张,option没有更新

环境

AnyImageKit 版本:
Xcode 版本:
Swift 版本:
iOS/iPadOS/macOS 版本:

picker 通过 capture 确定后,能否不直接退出 picker

你做了什么?

picker 通过 capture 确定后,直接退出 picker。能否回到 picker 相册浏览界面,让 user 有机会可以用 inner editor 编辑后再选择 edited capture photo。我觉得这样也更加合理些。

这也避免了的 issue #2 外部 editor的 issue,暂时就用 picker inner editor (它可以全屏)也差不多够用了。

你的预期是什么?

实际发生了什么?

环境

AnyImageKit 版本:
Xcode 版本:
Swift 版本:
iOS/iPadOS/macOS 版本:

如何在SwiftUI 中dismiss picker预览界面

我通过一个bool控制picker的显示,但是预览界面无法通过

  ` func imagePicker(_ picker: ImagePickerController, didFinishPicking result: PickerResult) {
     
        picker.dismiss(animated: true, completion: nil)
    }`

dismiss

在swiftUI中加载卡顿问题

ImagePicker在swiftUI中加载时卡顿,特别是如果在当前View加载而不是用.fullScreenCover的时候。有没有办法让它先快速的加载一个空白的View等picker完全加载好了再动画过渡进来。

CocoaPods 使用静态库依赖后会无法拷贝 default.metallib 至主工程

已知的问题(这是一个集成问题)

CocoaPods 支持静态库后可以支持将 Swift 库编译为 libXXX.a 并作为主工程的静态依赖,但是由源码编译产生的资源文件并不会自动拷贝至主工程,受到影响的有 .metal.mlmodel ,目前该问题一直未修复,如果你需要使用静态依赖,请拷贝 Capture/Shader 下的所有文件至您的主工程。使用 use frameworks!SPM 的用户不受影响。

详见: CocoaPods 的 issue

minimum crop size

I've looked into code and I didn't find a way to set minimum crop size. Is there any way to set it?

Features

  1. 能否在相册图库中,添加一个实时照相机预览;
  2. 编辑的时候, 目前有画笔了,但是能否在选择画笔的时候,还能选择画笔大小;

最新Xcode上编译失败

你做了什么?

你的预期是什么?

实际发生了什么?

Type 'AnyImageEditor.Coordinator' does not conform to protocol 'ImageEditorControllerDelegate'
Protocol requires function 'imageEditor(_:didFinishEditing:)' with type '(ImageEditorController, EditorResult) -> ()'

不一致:
func imageEditor(_ editor: ImageEditorController, didFinishEditing result: EditorResult)
func imageEditor(_ editor: ImageEditorController, didFinishEditing mediaURL: URL, type: MediaType, isEdited: Bool)

环境

AnyImageKit 版本:pod 'AnyImageKit', :git => 'https://github.com/AnyImageProject/AnyImageKit'
Xcode 版本:12.0.1
Swift 版本:5
iOS/iPadOS/macOS 版本:

Editor crash in SwiftUI.

你做了什么?

我为ImageEditorController封装了一个UIViewControllerRepresentable。用 fullScreenCover 去显示时 crash。
AnyImageEditor(image: self.$uiImage, options: { var options: EditorPhotoOptionsInfo = EditorPhotoOptionsInfo() options.toolOptions = [.crop, .pen, .text, .mosaic] return options }())

`import SwiftUI
import AnyImageKit

@available(iOS 13.0, *)
public struct AnyImageEditor: UIViewControllerRepresentable {
@Environment(.presentationMode) var presentationMode
@binding var uiImage: UIImage?
let options: EditorPhotoOptionsInfo

public init(image: Binding<UIImage?>, options: EditorPhotoOptionsInfo = EditorPhotoOptionsInfo()) {
    self._uiImage = image
    self.options = options
}

public func makeCoordinator() -> Coordinator {
    return Coordinator(parent: self)
}

public func makeUIViewController(context: UIViewControllerRepresentableContext<AnyImageEditor>) -> ImageEditorController {
    let editor = ImageEditorController(photo: uiImage ?? UIImage(), options: options, delegate: context.coordinator)
    return editor
}

public func updateUIViewController(_ uiViewController: ImageEditorController, context: UIViewControllerRepresentableContext<AnyImageEditor>) {
}

public class Coordinator: NSObject, UINavigationControllerDelegate, ImageEditorControllerDelegate {
    var parent: AnyImageEditor
    
    public init(parent: AnyImageEditor) {
        self.parent = parent
    }
    
    public func imageEditor(_ editor: ImageEditorController, didFinishEditing result: EditorResult) {
        if result.type == .photo {
            if result.isEdited, let photoData = try? Data(contentsOf: result.mediaURL), let photo = UIImage(data: photoData) {
                parent.uiImage = photo
            }
            parent.presentationMode.wrappedValue.dismiss()
            editor.dismiss(animated: true, completion: nil)
        }
    }
    
    public func imageEditorDidCancel(_ editor: ImageEditorController) {
        parent.presentationMode.wrappedValue.dismiss()
        editor.dismiss(animated: true, completion: nil)
    }
}

}`

你的预期是什么?

实际发生了什么?

crash report in PhotoEditorContentView, internal func layout():
Thread 1: "CALayer position contains NaN: [195 nan]. Layer: <CALayer:0x600000a43a60; position = CGPoint (0 0); bounds = CGRect (0 0; 0 0); delegate = <UIImageView: 0x7f93a7f80da0; frame = (0 0; 0 0); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x600000a43a60>>; sublayers = (<CALayer: 0x600000a675e0>); masksToBounds = YES; allowsGroupOpacity = YES; >"

环境

AnyImageKit 版本:latest
Xcode 版本:12.1
Swift 版本:5.3
iOS/iPadOS/macOS 版本:14.1

涂鸦缺失问题, touchesCancelled 并不能解决问题...

  1. touchesCancelled 实现之后仍然会有一定几率丢失涂鸦, 这里我还没找到具体原因, 几率太小.
  2. touchesCancelled 的实现会触发撤销撤销不了的问题, 只要 tap 操作稍有问题触发了 touchesCancelled 就会保存一次,然后你就会发现接下来的一次撤销没有作用. 同时 tap 操作极易触发 touchesCancelled 事件

这里我觉得在 PhotoEditorController 里面使用 singleTap, toolView 的响应全部自己处理是有问题的,touch传递和 tap 手势你始终无法处理...有逻辑矛盾.
我这边的解决方案是:

  1. PhotoEditorController 里面的 singleTap 只处理 toolview的显示隐藏.
  2. toolview 拥有自己的 tap 手势, 由这个手势来出来视图里面点击事件..
  3. 画面上面触发 touchs 事件隐藏显示 toolview.. 这样整个操作就完成了
  4. 上面还遗留下来一个小问题就是, 当 toolview 显示时, 从 toolview 上开始触摸无法涂鸦. 这里可以设置 toolView 里面的 tap.delaysTouchesBegan = true 来延迟响应 touch 事件, 并实现 touches 整个事件链, 这确定是否进行 canvas 的绘制操作..我这里toolview 直接持有了 canvas(急着处理问题) ,做了以下操作

extension EditorToolView {

    func canvasCanResponse() -> Bool {
        guard let can = canvas else {
            return false
        }

        return can.isUserInteractionEnabled
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if canvasCanResponse() {
            canvas?.touchesBegan(touches, with: event)
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        if canvasCanResponse() {
            canvas?.touchesMoved(touches, with: event)
        }
    }

    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        if canvasCanResponse() {
            canvas?.touchesCancelled(touches, with: event)
        }
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if canvasCanResponse() {
            canvas?.touchesEnded(touches, with: event)
        }
    }
}

这个整个问题就解决了,, 有一丢丢问题就是因为设置 delaysTouchesBegan, 从 toolview 上开始的涂鸦操作有点点缺失... 我看了微信, 这个问题也存在

时间倒序预览图片到最后一张时崩溃。

你做了什么?

.orderByDate == DESC

  1. 预览其他图片目录第一张图片时,大图显示的是当前图片下一张。
  2. 滑动到最后张图片崩溃。

原因:数组越界。

关键代码 AssetPickerViewController:

  func previewController(_ controller: PhotoPreviewController, assetOfIndex index: Int) -> PreviewData {
          let idx = index + itemOffset
          let indexPath = IndexPath(item: idx, section: 0)
          let cell = collectionView.cellForItem(at: indexPath) as? AssetCell
          return (cell?.image, album!.assets[idx])
  }
    private lazy var itemOffset: Int = {
        switch manager.options.orderByDate {
        case .asc:
            return 0
        case .desc:
            return 1
        }
    }()

为什么在预览时会加一个偏移量,是为了兼容打开相机按钮之后的偏移吗?

如果打开了相机按钮,切换图片目录的时候后没有相机按钮,是否可以添加判断,不使用偏移。

你的预期是什么?

实际发生了什么?

环境

AnyImageKit 版本:0.11.0
Xcode 版本:
Swift 版本:
iOS/iPadOS/macOS 版本:

拍摄预览CapturePreviewViewCPU占用较高

拍摄后获取到的CMSampleBuffer渲染(CapturePreviewView)建议使用 AVFoundation库中 AVSampleBufferDisplayLayer。减少CIImage转换过程以提高渲染效率,减少CPU的占用。

编辑图片是否支持旋转图片?

例如: 微信的编辑图片,可以进行对图片旋转编辑.

另外,微信的交互还有点不够完善,比如这种情况: 设置了编辑图片的比例是 3 :4 ,
那么旋转图片的时候,编辑区域也会跟着旋转.(微信)

(我的需求是:图片旋转,编辑区域固定 )

这个需求有考虑支持嚒?

画笔内容丢失

你做了什么?

当年画一个很短的路径, 下次一画,上一次那个痕迹会消失... (绘制很长也有一定几率触发)
很容易复现

貌似是 PhotoEditorController.swift 里面的 singleTap 被响应, 直接 cancel 了 touch, Cavans.swift 里面的 touchesEnded 不会走, 没有将上一帧保存..

在 SwiftUI 中使用 Editor crop 按下確定會直接回調

你做了什么?

import SwiftUI
import AnyImageKit

struct ImageEditorView: UIViewControllerRepresentable {
    @Binding var editedImage: UIImage?
    @Environment(\.presentationMode) var isPresented
    var sourceImage: UIImage
        
    func makeUIViewController(context: Context) -> ImageEditorController {
        var options = EditorPhotoOptionsInfo()
        options.toolOptions = [.crop]
        options.cropOptions = [.custom(w: 1, h: 1)]
        
        let controller = ImageEditorController(photo: sourceImage, options: options, delegate: context.coordinator)
        
        return controller
    }
 
 
    func updateUIViewController(_ uiViewController: ImageEditorController, context: Context) {
 
    }
    
    func makeCoordinator() -> ImageEditorCoordinator {
        return ImageEditorCoordinator(editor: self)
    }
    
}

class ImageEditorCoordinator: NSObject, ImageEditorControllerDelegate {
    var editor: ImageEditorView
    
    init(editor: ImageEditorView) {
        self.editor = editor
    }
    
    func imageEditorDidCancel(_ editor: ImageEditorController) {
        self.editor.isPresented.wrappedValue.dismiss()
    }

    func imageEditor(_ editor: ImageEditorController, didFinishEditing result: EditorResult) {
        self.editor.isPresented.wrappedValue.dismiss()

        if let data = try? Data(contentsOf: result.mediaURL) {
            let image = UIImage(data: data)!
            self.editor.editedImage = UIImage(cgImage: image.cgImage!, scale: 1, orientation: self.editor.sourceImage.imageOrientation)
        }
    }
    
}

你的预期是什么?

按下 done 按鈕才會回調 func imageEditor(_ editor: ImageEditorController, didFinishEditing result: EditorResult)

实际发生了什么?

在進入 crop 模式調整好要裁切的範圍後按下打勾圖案(並未按下 done 按鈕)就直接回調

环境

AnyImageKit 版本:0.13.1
Xcode 版本:12.5 (12E262)
Swift 版本:
iOS/iPadOS/macOS 版本:iOS 14.6

添加文字时, 当输入中文+字母确认返回时, 添加的图片的的文字显示不全

你做了什么?

添加文字时, 当输入中文+字母确认返回

你的预期是什么?

在图片上添加上正确的文字

实际发生了什么?

文字显示不全

原因

In InputTextViewController, this function updateTextCoverView
当点击确认返回前会更新 textCoverView 的宽度一次绘制正确跨度的图片, 但是使用
let lastLineWidth = calculateLabel.intrinsicContentSize.width + 30 这个有问题, 我们更新宽度应该用实际文字的跨度减去各个间距来获得.
This is my Code:

  private func updateTextCoverView() {
        let array = textView.getSeparatedLines()
        if array.count == 1 {
            calculateLabel.text = array.first!
            let font = textView.font ?? UIFont.systemFont(ofSize: 32, weight: .bold)
            let txtWidth = array.first!.bound(with: font, maxWidth: textView.bounds.width).size.width
            let offset = view.bounds.width - txtWidth - gap * 4
            textCoverView.snp.updateConstraints { (maker) in
                maker.right.equalToSuperview().offset(-offset)
            }
        }
    }

环境

Xcode 版本:11.3.1
Swift 版本:5.0
iOS/iPadOS/macOS 版本:10.15.3

asset.fetchVideoURL 冻结屏幕

你做了什么?

asset.fetchVideoURL

你的预期是什么?

在background thread 获取

实际发生了什么?

屏幕冻结

环境

14.7
AnyImageKit 版本:
Xcode 版本:
Swift 版本:
iOS/iPadOS/macOS 版本:

导出视频时提示The operation couldn’t be completed. (AnyImageKit.AnyImageError error 8.)

你做了什么?

选择视频后使用fetchVideoURL进行导出.

你的预期是什么?

在iOS11或以上我设定导出为.h265_1920x1080

实际发生了什么?

如果设定导出类型为.h265_1920x1080会出现此问题.

The operation couldn’t be completed. (AnyImageKit.AnyImageError error 8.)

环境

AnyImageKit 版本:0.12.0
Xcode 版本:Version 12.3 (12C33)
Swift 版本:5.3

该问题出现在运行 iOS 14.3 的iPhone SE初代机
运行 iOS 12.3.1 的iPhone6s

而在运行13.3.1的iPhone7上不会出现该问题,猜测很可能是iPhone7以前的机型无法支持HEVC.

画笔绘制到结束, 结束时代理的调用时机

你做了什么?

我需要知道每一步编辑结束后,图片是否被编辑了, 但是在第一次画笔涂鸦结束时获取的状态不对

你的预期是什么?

画完后图片应该是已被编辑

实际发生了什么?

第一次没有

原因

我使用了 penCache.hasDiskCache() 来获取图片是否被涂鸦, 但是 在第一次涂鸦结束, 先调用了代理方法,之后才将截图保存到 cache.

This is my code:

  func canvasDidEndPen() {
        let screenshot = canvas.screenshot
        canvas.lastPenImageView.image = screenshot
        canvas.reset()
        penCache.write(screenshot)

        delegate?.photoDidEndPen()
    }

我把代码方法调用放在最后, 不知道有没有问题?

环境

Xcode 版本:11.3.1
Swift 版本:5.0
iOS/iPadOS/macOS 版本:10.15.1

滤镜效果

拍摄照片、视频时能否加上部分滤镜效果

Picker 能否支持预先选择一些图片

使用场景 1:
用户在社区发帖并选择了 6 张图片,但是编辑正文过程中反悔,希望去掉其中两张,再次使用 Picker 进行选择,此时之前的 6 张已经选中,只需要去掉不需要的两张即可。

使用场景 2:
用户在社区发帖并选择了 6 张图片,但是编辑正文过程中反悔,进入 Picker 之前在帖子编辑页面上删除了两张,再次使用 Picker 进行选择,此时之前的 6 - 2 张已经选中,用户又额外选择了 3 张其他图片,点击确定返回总计 7 张图片。

希望作者能在下个版本添加类似QQ的圆形裁剪框的选项~

首先感谢你们的付出,这是一个非常非常棒的一个图片选择器,界面美观动画流畅功能强大!
除了标题所说:

  1. 预览和编辑界面显示出来的图片不是原图,有一点模糊
  2. 在把selectionTapAction设置为openEditor之后,打开稍微大一点的图片会加载很久很久,用系统的或者其他的图片选择器不会出现这种情况,请问这是什么原因呢
    image

希望增加asset过滤条件

希望asset列表展示的结果可以控制是否显示以满足那种比如超过某个时长的视频asset不可选择之类的需求

拍照

楼主你这拍照 后置摄像头 移动卡卡的

ImageEditorController 中不能划线、马赛克,下部的按钮显示问题。swiftui

你做了什么?

我用 UIViewControllerRepresentable 封装了 ImageEditorController,用 swiftui 的 sheet 来调用显示。由于目前 sheet 不能是全屏的,造成了不能划线、马赛克(crop 可以的),只能断续打点,而且只能点一下,再点一下,上次的点消失,不知道是否是与sheet 下拉关闭有冲突造成的。下部的按钮也因为不是全屏,显示到iphonex下巴安全区了,可能不能点击。

你的预期是什么?

实际发生了什么?

环境

AnyImageKit 版本:最新pod install
Xcode 版本:11.3
Swift 版本:5
iOS/iPadOS/macOS 版本:13.3

Source Code:
`//
// AnyImageEditor.swift
//
// Created by foolbear on 2020/1/13.
//

import SwiftUI
import AnyImageKit

@available(iOS 13.0, *)
public struct AnyImageEditor: UIViewControllerRepresentable {
@Environment(.presentationMode) var presentationMode
@binding var uiImage: UIImage?
@binding var isEdited: Bool
let config: ImageEditorController.PhotoConfig

public init(image: Binding<UIImage?>, isEdited: Binding<Bool>, config: ImageEditorController.PhotoConfig = ImageEditorController.PhotoConfig()) {
    self._uiImage = image
    self._isEdited = isEdited
    self.config = config
}

public func makeCoordinator() -> Coordinator {
    return Coordinator(parent: self)
}

public func makeUIViewController(context: UIViewControllerRepresentableContext<AnyImageEditor>) -> ImageEditorController {
    let editor = ImageEditorController(image: uiImage ?? UIImage(), config: config, delegate: context.coordinator)
    return editor
}

public func updateUIViewController(_ uiViewController: ImageEditorController, context: UIViewControllerRepresentableContext<AnyImageEditor>) {
}

public class Coordinator: NSObject, UINavigationControllerDelegate, ImageEditorControllerDelegate {
    var parent: AnyImageEditor
    
    public init(parent: AnyImageEditor) {
        self.parent = parent
    }
    
    public func imageEditor(_ editor: ImageEditorController, didFinishEditing photo: UIImage, isEdited: Bool) {
        parent.uiImage = photo
        parent.isEdited = isEdited
        parent.presentationMode.wrappedValue.dismiss()
        editor.dismiss(animated: true, completion: nil)
    }
    
    public func imageEditorDidCancel(_ editor: ImageEditorController) {
        parent.presentationMode.wrappedValue.dismiss()
        editor.dismiss(animated: true, completion: nil)
    }
}

}

`

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.