From 994b47caddd8c1042510d326d345476a0e86a5db Mon Sep 17 00:00:00 2001 From: c-nguyen Date: Mon, 9 Apr 2018 19:36:40 +0900 Subject: [PATCH 1/3] [ADD] custom language function --- .../source/ImageEditor/Crop/FMCrop.swift | 41 +----------- .../source/ImageEditor/Crop/FMCroppable.swift | 37 +++++++++++ .../Picker/FMPhotoPickerViewController.swift | 11 +++- .../Picker/FMPhotoPickerViewController.xib | 15 ++--- .../Editor/FMImageEditorViewController.swift | 39 ++++++++---- .../Editor/FMImageEditorViewController.xib | 62 ++++++------------- .../Editor/Views/FMCropMenuView.swift | 19 +++--- .../FMPhotoPresenterViewController.swift | 12 +++- .../FMPhotoPresenterViewController.xib | 38 +++++------- .../Views/FMPresenterBottomView.swift | 4 +- .../Views/FMPresenterEditMenuView.swift | 8 ++- .../source/Utilities/FMAlertable.swift | 6 +- .../Utilities/FMPhotoPickerConfig.swift | 20 ++++++ .../source/Utilities/FMWarningView.swift | 8 ++- .../FMPhotoPickerExample/ViewController.swift | 20 ++++++ 15 files changed, 197 insertions(+), 143 deletions(-) diff --git a/FMPhotoPicker/FMPhotoPicker/source/ImageEditor/Crop/FMCrop.swift b/FMPhotoPicker/FMPhotoPicker/source/ImageEditor/Crop/FMCrop.swift index 9fc2777..dd90b98 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/ImageEditor/Crop/FMCrop.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/ImageEditor/Crop/FMCrop.swift @@ -33,48 +33,13 @@ public enum FMCrop: FMCroppable { } } - public func crop(image: UIImage, toRect rect: CGRect) -> UIImage { - let orientation = image.imageOrientation - let scale = image.scale - var targetRect = CGRect() - - switch orientation { - case .down: - targetRect.origin.x = (image.size.width - rect.maxX) * scale - targetRect.origin.y = (image.size.height - rect.maxY) * scale - targetRect.size.width = rect.width * scale - targetRect.size.height = rect.height * scale - case .right: - targetRect.origin.x = rect.minY * scale - targetRect.origin.y = (image.size.width - rect.maxX) * scale - targetRect.size.width = rect.height * scale - targetRect.size.height = rect.width * scale - case .left: - targetRect.origin.x = image.size.height - rect.maxY * scale - targetRect.origin.y = rect.minX * scale - targetRect.size.width = rect.height * scale - targetRect.size.height = rect.width * scale - default: - targetRect = CGRect(x: rect.origin.x * scale, - y: rect.origin.y * scale, - width: rect.width * scale, - height: rect.height * scale) - } - - if let croppedCGImage = image.cgImage?.cropping(to: targetRect) { - return UIImage(cgImage: croppedCGImage, scale: scale, orientation: orientation) - } - - return image - } - public func name() -> String { switch self { case .ratio4x3: return "4:3" case .ratio16x9: return "16:9" - case .ratioCustom: return "カスタム" - case .ratioOrigin: return "元の比率" - case .ratioSquare: return "正方形" + case .ratioCustom: return "Custom" + case .ratioOrigin: return "Origin" + case .ratioSquare: return "Square" } } diff --git a/FMPhotoPicker/FMPhotoPicker/source/ImageEditor/Crop/FMCroppable.swift b/FMPhotoPicker/FMPhotoPicker/source/ImageEditor/Crop/FMCroppable.swift index 7f1b413..64b41a6 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/ImageEditor/Crop/FMCroppable.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/ImageEditor/Crop/FMCroppable.swift @@ -14,3 +14,40 @@ public protocol FMCroppable { func icon() -> UIImage func ratio() -> FMCropRatio? } + +extension FMCroppable { + public func crop(image: UIImage, toRect rect: CGRect) -> UIImage { + let orientation = image.imageOrientation + let scale = image.scale + var targetRect = CGRect() + + switch orientation { + case .down: + targetRect.origin.x = (image.size.width - rect.maxX) * scale + targetRect.origin.y = (image.size.height - rect.maxY) * scale + targetRect.size.width = rect.width * scale + targetRect.size.height = rect.height * scale + case .right: + targetRect.origin.x = rect.minY * scale + targetRect.origin.y = (image.size.width - rect.maxX) * scale + targetRect.size.width = rect.height * scale + targetRect.size.height = rect.width * scale + case .left: + targetRect.origin.x = image.size.height - rect.maxY * scale + targetRect.origin.y = rect.minX * scale + targetRect.size.width = rect.height * scale + targetRect.size.height = rect.width * scale + default: + targetRect = CGRect(x: rect.origin.x * scale, + y: rect.origin.y * scale, + width: rect.width * scale, + height: rect.height * scale) + } + + if let croppedCGImage = image.cgImage?.cropping(to: targetRect) { + return UIImage(cgImage: croppedCGImage, scale: scale, orientation: orientation) + } + + return image + } +} diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.swift b/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.swift index 2a21a03..59bb1de 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.swift @@ -21,6 +21,7 @@ public class FMPhotoPickerViewController: UIViewController { @IBOutlet weak var numberOfSelectedPhoto: UILabel! @IBOutlet weak var determineButton: UIButton! @IBOutlet weak var controlBarTopConstrant: NSLayoutConstraint! + @IBOutlet weak var cancelButton: UIButton! // MARK: - Public public weak var delegate: FMPhotoPickerViewControllerDelegate? = nil @@ -90,6 +91,12 @@ public class FMPhotoPickerViewController: UIViewController { self.controlBarTopConstrant.constant = 44 } } + + // set button title + self.cancelButton.setTitle(config.strings["picker_button_cancel"], for: .normal) + self.cancelButton.titleLabel!.font = UIFont.systemFont(ofSize: config.titleFontSize) + self.determineButton.setTitle(config.strings["picker_button_select_done"], for: .normal) + self.determineButton.titleLabel!.font = UIFont.systemFont(ofSize: config.titleFontSize) } // MARK: - Target Actions @@ -225,14 +232,14 @@ extension FMPhotoPickerViewController: UICollectionViewDataSource { if self.dataSource.countSelectedPhoto(byType: .image) >= self.config.maxImage { canBeAdded = false let warning = FMWarningView.shared - warning.message = "画像は最大\(self.config.maxImage)個まで選択できます。" + warning.message = String(format: config.strings["picker_warning_over_image_select_format"]!, self.config.maxImage) warning.showAndAutoHide() } case .video: if self.dataSource.countSelectedPhoto(byType: .video) >= self.config.maxVideo { canBeAdded = false let warning = FMWarningView.shared - warning.message = "動画は最大\(self.config.maxVideo)個まで選択できます。" + warning.message = String(format: config.strings["picker_warning_over_video_select_format"]!, self.config.maxImage) warning.showAndAutoHide() } case .unsupported: diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.xib b/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.xib index 202ae0b..6015c80 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.xib +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.xib @@ -12,6 +12,7 @@ + @@ -29,24 +30,24 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/Views/FMCropMenuView.swift b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/Views/FMCropMenuView.swift index db6de9e..813edff 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/Views/FMCropMenuView.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/Views/FMCropMenuView.swift @@ -13,11 +13,11 @@ enum FMCropControl { case resetFrameWithoutChangeRatio case rotate - func name() -> String { + func name(from stringConfig: [String: String]) -> String { switch self { - case .resetFrameWithoutChangeRatio: return "リセット" - case .resetAll: return "リセット" - case .rotate: return "回転" + case .resetFrameWithoutChangeRatio: return stringConfig["editor_menu_crop_button_reset"]! + case .resetAll: return stringConfig["editor_menu_crop_button_reset"]! + case .rotate: return stringConfig["editor_menu_crop_button_rotate"]! } } @@ -47,21 +47,24 @@ class FMCropMenuView: UIView { } } - init(appliedCrop: FMCroppable?, availableCrops: [FMCroppable], forceCropEnabled: Bool) { + private var config: FMPhotoPickerConfig + + init(appliedCrop: FMCroppable?, availableCrops: [FMCroppable], config: FMPhotoPickerConfig) { selectedCrop = appliedCrop + self.config = config var tAvailableCrops = availableCrops tAvailableCrops = tAvailableCrops.count == 0 ? kDefaultAvailableCrops : tAvailableCrops // if the force crop mode is enabled // then only the first crop type in the avaiableCrops will be used - if forceCropEnabled { + if config.forceCropEnabled { tAvailableCrops = [tAvailableCrops.first!] } cropItems = tAvailableCrops - if forceCropEnabled { + if config.forceCropEnabled { menuItems = [.resetFrameWithoutChangeRatio] } else { menuItems = [.resetAll] @@ -127,7 +130,7 @@ extension FMCropMenuView: UICollectionViewDataSource { if indexPath.section == 0 { // menu items - cell.name.text = menuItems[indexPath.row].name() + cell.name.text = menuItems[indexPath.row].name(from: config.strings) cell.imageView.image = menuItems[indexPath.row].icon() } else if indexPath.section == 1 { // crop items diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.swift b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.swift index 0901057..ea41bdd 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.swift @@ -19,6 +19,7 @@ class FMPhotoPresenterViewController: UIViewController { @IBOutlet weak var numberOfSelectedPhotoContainer: UIView! @IBOutlet weak var numberOfSelectedPhoto: UILabel! @IBOutlet weak var determineButton: UIButton! + @IBOutlet weak var backButton: UIButton! // MARK: - Public public var swipeInteractionController: FMPhotoInteractionAnimator? @@ -50,7 +51,7 @@ class FMPhotoPresenterViewController: UIViewController { private lazy var formatter: DateFormatter = { let formatter = DateFormatter() - formatter.dateFormat = "yyyy年M月d日" + formatter.dateFormat = config.strings["present_title_photo_created_date_format"] formatter.calendar = Calendar(identifier: .gregorian) return formatter }() @@ -105,7 +106,7 @@ class FMPhotoPresenterViewController: UIViewController { // Init bottom view - self.bottomView = FMPresenterBottomView() + self.bottomView = FMPresenterBottomView(config: config) swipeInteractionController = FMPhotoInteractionAnimator(viewController: self) self.bottomView.touchBegan = { [unowned self] in @@ -156,6 +157,13 @@ class FMPhotoPresenterViewController: UIViewController { // in multiple mode done button only appear when at least one image has beem selected self.determineButton.isHidden = true } + + // set button title + self.backButton.setTitle(config.strings["present_button_back"], for: .normal) + self.backButton.titleLabel!.font = UIFont.systemFont(ofSize: config.titleFontSize) + + self.determineButton.setTitle(config.strings["picker_button_select_done"], for: .normal) + self.determineButton.titleLabel!.font = UIFont.systemFont(ofSize: config.titleFontSize) } override func viewDidAppear(_ animated: Bool) { diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.xib b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.xib index b542bec..f946c0a 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.xib +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.xib @@ -12,6 +12,7 @@ + @@ -38,13 +39,17 @@ - - - - - - - - @@ -82,7 +80,7 @@ - + - + - - + - diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Views/FMPresenterBottomView.swift b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Views/FMPresenterBottomView.swift index 7a3e79f..3f614c9 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Views/FMPresenterBottomView.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Views/FMPresenterBottomView.swift @@ -33,9 +33,9 @@ class FMPresenterBottomView: UIView { fatalError("init(coder:) has not been implemented") } - init() { + init(config: FMPhotoPickerConfig) { playbackControlView = FMPlaybackControlView() - editMenuView = FMPresenterEditMenuView() + editMenuView = FMPresenterEditMenuView(config: config) super.init(frame: .zero) self.addSubview(playbackControlView) diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Views/FMPresenterEditMenuView.swift b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Views/FMPresenterEditMenuView.swift index ff1320c..e11652d 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Views/FMPresenterEditMenuView.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Views/FMPresenterEditMenuView.swift @@ -13,7 +13,7 @@ class FMPresenterEditMenuView: UIView { public var onTapEditButton: (() -> Void)? - init() { + init(config: FMPhotoPickerConfig) { editButton = UIButton() super.init(frame: .zero) @@ -22,9 +22,11 @@ class FMPresenterEditMenuView: UIView { editButton.translatesAutoresizingMaskIntoConstraints = false editButton.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true editButton.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true + editButton.widthAnchor.constraint(greaterThanOrEqualToConstant: 80).isActive = true + editButton.heightAnchor.constraint(greaterThanOrEqualToConstant: 40).isActive = true editButton.setTitleColor(.black, for: .normal) - editButton.setTitle("編集", for: .normal) - editButton.titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: .bold) + editButton.setTitle(config.strings["present_button_edit_image"], for: .normal) + editButton.titleLabel?.font = UIFont.systemFont(ofSize: config.titleFontSize, weight: .bold) editButton.addTarget(self, action: #selector(editButtonTarget), for: .touchUpInside) diff --git a/FMPhotoPicker/FMPhotoPicker/source/Utilities/FMAlertable.swift b/FMPhotoPicker/FMPhotoPicker/source/Utilities/FMAlertable.swift index d50f329..296bd63 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Utilities/FMAlertable.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/Utilities/FMAlertable.swift @@ -14,10 +14,10 @@ public protocol FMAlertable { struct FMAlert: FMAlertable { func show(in viewController: UIViewController, ok: @escaping () -> Void, cancel: @escaping () -> Void) { - let alert = UIAlertController(title: "編集内容をキャンセルしてもよろしいですか?", message: nil, preferredStyle: .alert) + let alert = UIAlertController(title: "Are you sure you want to cancel?", message: nil, preferredStyle: .alert) - alert.addAction(UIAlertAction(title: "はい", style: .cancel, handler: { _ in ok() })) - alert.addAction(UIAlertAction(title: "いいえ", style: .default, handler: { _ in cancel() })) + alert.addAction(UIAlertAction(title: "Yes", style: .cancel, handler: { _ in ok() })) + alert.addAction(UIAlertAction(title: "No", style: .default, handler: { _ in cancel() })) viewController.present(alert, animated: true, completion: nil) } diff --git a/FMPhotoPicker/FMPhotoPicker/source/Utilities/FMPhotoPickerConfig.swift b/FMPhotoPicker/FMPhotoPicker/source/Utilities/FMPhotoPickerConfig.swift index 20d9bb7..baf11ca 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Utilities/FMPhotoPickerConfig.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/Utilities/FMPhotoPickerConfig.swift @@ -54,6 +54,26 @@ public struct FMPhotoPickerConfig { public var forceCropEnabled = false public var eclipsePreviewEnabled = false + public var titleFontSize: CGFloat = 17 + + public var strings: [String: String] = [ + "picker_button_cancel": "Cancel", + "picker_button_select_done": "Done", + "picker_warning_over_image_select_format": "You can select maximum %d images", + "picker_warning_over_video_select_format": "You can select maximum %d videos", + + "present_title_photo_created_date_format": "yyyy/M/d", + "present_button_back": "Back", + "present_button_edit_image": "Edit", + + "editor_button_cancel": "Cancel", + "editor_button_done": "Done", + "editor_menu_filter": "Filter", + "editor_menu_crop": "Crop", + "editor_menu_crop_button_reset": "Reset", + "editor_menu_crop_button_rotate": "Rotate", + ] + public init() { } diff --git a/FMPhotoPicker/FMPhotoPicker/source/Utilities/FMWarningView.swift b/FMPhotoPicker/FMPhotoPicker/source/Utilities/FMWarningView.swift index d588b57..50b1eb7 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Utilities/FMWarningView.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/Utilities/FMWarningView.swift @@ -50,10 +50,14 @@ class FMWarningView { self.messageLabel.textColor = .white self.messageLabel.font = UIFont.systemFont(ofSize: 15) self.messageLabel.text = self.message + self.messageLabel.numberOfLines = 2 + self.messageLabel.textAlignment = .center self.contentView.addSubview(self.messageLabel) - self.messageLabel.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor, constant: 0).isActive = true - self.messageLabel.centerYAnchor.constraint(equalTo: self.contentView.centerYAnchor, constant: 0).isActive = true + self.messageLabel.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 8) .isActive = true + self.messageLabel.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -8).isActive = true + self.messageLabel.leftAnchor.constraint(equalTo: self.contentView.leftAnchor, constant: 8).isActive = true + self.messageLabel.rightAnchor.constraint(equalTo: self.contentView.rightAnchor, constant: -8).isActive = true } func showAndAutoHide() { diff --git a/FMPhotoPickerExample/FMPhotoPickerExample/ViewController.swift b/FMPhotoPickerExample/FMPhotoPickerExample/ViewController.swift index 9baeeeb..7c4329f 100644 --- a/FMPhotoPickerExample/FMPhotoPickerExample/ViewController.swift +++ b/FMPhotoPickerExample/FMPhotoPickerExample/ViewController.swift @@ -102,6 +102,26 @@ class ViewController: UIViewController, FMPhotoPickerViewControllerDelegate, FMI // all available filters will be used config.availableFilters = [] + config.titleFontSize = 14 + + config.strings = [ + "picker_button_cancel": "キャンセル", + "picker_button_select_done": "決定", + "picker_warning_over_image_select_format": "画像は最大%d個まで選択できます。", + "picker_warning_over_video_select_format": "動画は最大%d個まで選択できます。", + + "present_title_photo_created_date_format": "yyyy年M月d日", + "present_button_back": "一覧", + "present_button_edit_image": "編集", + + "editor_button_cancel": "キャンセル", + "editor_button_done": "決定", + "editor_menu_filter": "フィルター", + "editor_menu_crop": "調整", + "editor_menu_crop_button_reset": "リセット", + "editor_menu_crop_button_rotate": "回転", + ] + return config } From b56912007aac5569c9f78184f90cc858b22c897c Mon Sep 17 00:00:00 2001 From: c-nguyen Date: Tue, 10 Apr 2018 14:54:07 +0900 Subject: [PATCH 2/3] [FIX] layout with safearea issue --- .../Picker/FMPhotoPickerViewController.swift | 9 ---- .../Picker/FMPhotoPickerViewController.xib | 3 +- .../Editor/FMImageEditorViewController.swift | 16 +++++- .../Editor/FMImageEditorViewController.xib | 54 +++++++++++++++---- .../Editor/Views/FMCropMenuView.swift | 7 ++- .../Editor/Views/FMFiltersMenuView.swift | 3 ++ .../FMPhotoPresenterViewController.swift | 26 +++++---- .../FMPhotoPresenterViewController.xib | 28 +++++++--- 8 files changed, 101 insertions(+), 45 deletions(-) diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.swift b/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.swift index 59bb1de..dacade5 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.swift @@ -20,7 +20,6 @@ public class FMPhotoPickerViewController: UIViewController { @IBOutlet weak var numberOfSelectedPhotoContainer: UIView! @IBOutlet weak var numberOfSelectedPhoto: UILabel! @IBOutlet weak var determineButton: UIButton! - @IBOutlet weak var controlBarTopConstrant: NSLayoutConstraint! @IBOutlet weak var cancelButton: UIButton! // MARK: - Public @@ -84,14 +83,6 @@ public class FMPhotoPickerViewController: UIViewController { self.numberOfSelectedPhotoContainer.isHidden = true self.determineButton.isHidden = true - if #available(iOS 11.0, *) { - guard let window = UIApplication.shared.keyWindow else { return } - if window.safeAreaInsets.top > 0 { - // iPhone X - self.controlBarTopConstrant.constant = 44 - } - } - // set button title self.cancelButton.setTitle(config.strings["picker_button_cancel"], for: .normal) self.cancelButton.titleLabel!.font = UIFont.systemFont(ofSize: config.titleFontSize) diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.xib b/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.xib index 6015c80..38f3064 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.xib +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Picker/FMPhotoPickerViewController.xib @@ -13,7 +13,6 @@ - @@ -107,8 +106,8 @@ - + diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/FMImageEditorViewController.swift b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/FMImageEditorViewController.swift index 3477427..6481547 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/FMImageEditorViewController.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/FMImageEditorViewController.swift @@ -18,6 +18,7 @@ public protocol FMImageEditorViewControllerDelegate: class { public class FMImageEditorViewController: UIViewController { @IBOutlet weak var topMenuTopConstraint: NSLayoutConstraint! + @IBOutlet weak var transparentViewHeightConstraint: NSLayoutConstraint! @IBOutlet weak var bottomMenuBottomConstraint: NSLayoutConstraint! @IBOutlet weak var topMenuContainter: UIView! @IBOutlet weak var bottomMenuContainer: UIView! @@ -29,6 +30,9 @@ public class FMImageEditorViewController: UIViewController { @IBOutlet weak var cancelButton: UIButton! @IBOutlet weak var doneButton: UIButton! + @IBOutlet weak var unsafeAreaBottomViewHeightConstraint: NSLayoutConstraint! + @IBOutlet weak var unsafeAreaBottomView: UIView! + public var didEndEditting: (@escaping () -> Void) -> Void = { _ in } public var delegate: FMImageEditorViewControllerDelegate? @@ -252,6 +256,14 @@ public class FMImageEditorViewController: UIViewController { override public func viewDidLayoutSubviews() { cropView.frame = view.frame + + if #available(iOS 11.0, *) { + transparentViewHeightConstraint.constant = view.safeAreaInsets.top + 44 + + unsafeAreaBottomViewHeightConstraint.constant = view.safeAreaInsets.bottom + unsafeAreaBottomView.backgroundColor = .white + unsafeAreaBottomView.alpha = 0.9 + } } override public func viewDidDisappear(_ animated: Bool) { @@ -358,7 +370,7 @@ public class FMImageEditorViewController: UIViewController { self.filterSubMenuView.alpha = 0 }, completion: { _ in - self.subMenuContainer.backgroundColor = .white +// self.subMenuContainer.backgroundColor = .white self.filterSubMenuView.isHidden = true }) } @@ -376,7 +388,7 @@ public class FMImageEditorViewController: UIViewController { self.cropSubMenuView.alpha = 0 }, completion: { _ in - self.subMenuContainer.backgroundColor = .white +// self.subMenuContainer.backgroundColor = .white self.cropSubMenuView.isHidden = true }) } diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/FMImageEditorViewController.xib b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/FMImageEditorViewController.xib index 3ea1ad4..09115d1 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/FMImageEditorViewController.xib +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/FMImageEditorViewController.xib @@ -20,7 +20,10 @@ - + + + + @@ -30,14 +33,17 @@ - + - + + + + - + - + @@ -133,29 +142,37 @@ - + - + + + + + + + + + @@ -167,22 +184,37 @@ + + + + + + + + + + + + + - + + + diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/Views/FMCropMenuView.swift b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/Views/FMCropMenuView.swift index 813edff..0ad2344 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/Views/FMCropMenuView.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/Views/FMCropMenuView.swift @@ -92,10 +92,9 @@ class FMCropMenuView: UIView { collectionView.delegate = self collectionView.showsHorizontalScrollIndicator = false collectionView.contentInset = UIEdgeInsetsMake(0,14,0,14) - -// collectionView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.old, context: nil) - - backgroundColor = .red + + self.backgroundColor = .clear + collectionView.backgroundColor = .clear } func insert(toView parentView: UIView) { diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/Views/FMFiltersMenuView.swift b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/Views/FMFiltersMenuView.swift index c18e62a..fa4cd36 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/Views/FMFiltersMenuView.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/Editor/Views/FMFiltersMenuView.swift @@ -55,6 +55,9 @@ class FMFiltersMenuView: UIView { collectionView.contentInset = UIEdgeInsetsMake(0,14,0,14) collectionView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.old, context: nil) + + self.backgroundColor = .clear + collectionView.backgroundColor = .clear } func insert(toView parenetView: UIView) { diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.swift b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.swift index ea41bdd..f254f29 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.swift +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.swift @@ -15,11 +15,13 @@ class FMPhotoPresenterViewController: UIViewController { @IBOutlet weak var selectedContainer: UIView! @IBOutlet weak var selectedIcon: UIImageView! @IBOutlet weak var selectedIndex: UILabel! - @IBOutlet weak var controlBarHeightConstraint: NSLayoutConstraint! @IBOutlet weak var numberOfSelectedPhotoContainer: UIView! @IBOutlet weak var numberOfSelectedPhoto: UILabel! @IBOutlet weak var determineButton: UIButton! @IBOutlet weak var backButton: UIButton! + @IBOutlet weak var transparentViewHeightConstraint: NSLayoutConstraint! + @IBOutlet weak var unsafeAreaBottomViewHeightConstraint: NSLayoutConstraint! + @IBOutlet weak var unsafeAreaBottomView: UIView! // MARK: - Public public var swipeInteractionController: FMPhotoInteractionAnimator? @@ -45,6 +47,8 @@ class FMPhotoPresenterViewController: UIViewController { private var config: FMPhotoPickerConfig + private var bottomViewBottomConstraint: NSLayoutConstraint! + private var currentPhotoViewController: FMPhotoViewController? { return pageViewController.viewControllers?.first as? FMPhotoViewController } @@ -88,14 +92,6 @@ class FMPhotoPresenterViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - if #available(iOS 11.0, *) { - guard let window = UIApplication.shared.keyWindow else { return } - if window.safeAreaInsets.top > 0 { - // iPhone X - self.controlBarHeightConstraint.constant = 88 - } - } - self.selectedContainer.layer.cornerRadius = self.selectedContainer.frame.size.width / 2 self.updateInfoBar() @@ -137,7 +133,8 @@ class FMPhotoPresenterViewController: UIViewController { self.bottomView.translatesAutoresizingMaskIntoConstraints = false self.bottomView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true self.bottomView.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true - self.bottomView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true + bottomViewBottomConstraint = self.bottomView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor) + bottomViewBottomConstraint.isActive = true self.bottomView.heightAnchor.constraint(equalToConstant: 90).isActive = true self.pageViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] @@ -175,6 +172,15 @@ class FMPhotoPresenterViewController: UIViewController { override func viewDidLayoutSubviews() { bottomView.updateFrames() + + if #available(iOS 11.0, *) { + transparentViewHeightConstraint.constant = view.safeAreaInsets.top + 44 // 44 is the height of nav bar + bottomViewBottomConstraint.constant = -view.safeAreaInsets.bottom + + unsafeAreaBottomViewHeightConstraint.constant = view.safeAreaInsets.bottom + unsafeAreaBottomView.backgroundColor = .white + unsafeAreaBottomView.alpha = 0.9 + } } override func didReceiveMemoryWarning() { diff --git a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.xib b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.xib index f946c0a..4f0c972 100644 --- a/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.xib +++ b/FMPhotoPicker/FMPhotoPicker/source/Scene/Presenter/FMPhotoPresenterViewController.xib @@ -13,7 +13,6 @@ - @@ -21,6 +20,9 @@ + + + @@ -30,14 +32,17 @@ - + - + + + + - +