Skip to content

Commit

Permalink
add Crop Grid View
Browse files Browse the repository at this point in the history
  • Loading branch information
xu.shuifeng authored and xu.shuifeng committed Jan 7, 2019
1 parent 1ab5fab commit 57dbd59
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 39 deletions.
4 changes: 4 additions & 0 deletions MetalFilters.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
A3710C5E20D3DADF00FC0025 /* MTImageOverlayFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3710C5D20D3DADF00FC0025 /* MTImageOverlayFilter.swift */; };
A3710C6020D3DAF800FC0025 /* MTImageOverlayFilter.metal in Sources */ = {isa = PBXBuildFile; fileRef = A3710C5F20D3DAF800FC0025 /* MTImageOverlayFilter.metal */; };
A382041121E33D6E0000AC41 /* MTScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A382041021E33D6E0000AC41 /* MTScrollView.swift */; };
A382041521E37D750000AC41 /* MTGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A382041421E37D750000AC41 /* MTGridView.swift */; };
A38FC65A20CB7979002CA905 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A38FC65920CB7979002CA905 /* MainViewController.swift */; };
A38FC66020CB85B2002CA905 /* PhotoEditorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A38FC65F20CB85B2002CA905 /* PhotoEditorViewController.swift */; };
A38FC66420CBEAA5002CA905 /* AlbumPhotoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A38FC66320CBEAA5002CA905 /* AlbumPhotoCell.swift */; };
Expand Down Expand Up @@ -145,6 +146,7 @@
A3710C5D20D3DADF00FC0025 /* MTImageOverlayFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MTImageOverlayFilter.swift; sourceTree = "<group>"; };
A3710C5F20D3DAF800FC0025 /* MTImageOverlayFilter.metal */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.metal; path = MTImageOverlayFilter.metal; sourceTree = "<group>"; };
A382041021E33D6E0000AC41 /* MTScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MTScrollView.swift; sourceTree = "<group>"; };
A382041421E37D750000AC41 /* MTGridView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MTGridView.swift; sourceTree = "<group>"; };
A38FC65920CB7979002CA905 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = "<group>"; };
A38FC65F20CB85B2002CA905 /* PhotoEditorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoEditorViewController.swift; sourceTree = "<group>"; };
A38FC66320CBEAA5002CA905 /* AlbumPhotoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumPhotoCell.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -467,6 +469,7 @@
A32F2BF320D2393E0018C281 /* FilterTintColorPicker.swift */,
A32F2BFC20D260DC0018C281 /* FilterTintColorControl.swift */,
A382041021E33D6E0000AC41 /* MTScrollView.swift */,
A382041421E37D750000AC41 /* MTGridView.swift */,
);
path = Views;
sourceTree = "<group>";
Expand Down Expand Up @@ -647,6 +650,7 @@
A391B30420CE4CCA00E6FD67 /* MTLoFiFilter.swift in Sources */,
A38FC66620CBEB0E002CA905 /* AlbumPhotoViewController.swift in Sources */,
A30D742320D0EC2A00824A1A /* MTLocalLaplacianFilter.metal in Sources */,
A382041521E37D750000AC41 /* MTGridView.swift in Sources */,
A3E572B920F8B5BF00294AE4 /* MTLuxBlendFilter.metal in Sources */,
A391B32720CE4CCA00E6FD67 /* MTNormalFilter.metal in Sources */,
A391B31220CE4CCA00E6FD67 /* MTMoonVideoFilter.swift in Sources */,
Expand Down
2 changes: 1 addition & 1 deletion MetalFilters/ViewControllers/MainViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ class MainViewController: UIViewController {
return
}
editorController.croppedImage = scrollView.croppedImage
editorController.originAsset = selectedAsset

navigationController?.pushViewController(editorController, animated: false)
}

Expand Down
60 changes: 23 additions & 37 deletions MetalFilters/ViewControllers/PhotoEditorViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ class PhotoEditorViewController: UIViewController {
fileprivate var filterControlView: FilterControlView?
fileprivate var imageView: MTIImageView!

public var croppedImage: UIImage?
public var originAsset: PHAsset?
public var croppedImage: UIImage!

fileprivate var originInputImage: MTIImage?
fileprivate var adjustFilter = MTBasicAdjustFilter()

Expand All @@ -41,46 +41,33 @@ class PhotoEditorViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()

let luxImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 24, height: 24))
luxImageView.image = UIImage(named: "edit-luxtool")
navigationItem.titleView = luxImageView
setupNavigationBar()

imageView = MTIImageView(frame: previewView.bounds)
imageView.resizingMode = .aspectFill
imageView.backgroundColor = .clear

previewView.addSubview(imageView)
allFilters = MTFilterManager.shard.allFilters

setupFilterCollectionView()
setupToolDataSource()
setupToolCollectionView()

guard let asset = originAsset else {
return
}
// let targetSize = CGSize(width: asset.pixelWidth, height: asset.pixelHeight)
// let options = PHImageRequestOptions()
// options.isSynchronous = true
// options.deliveryMode = .highQualityFormat
// PHImageManager.default().requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFit, options: options) { (image, _) in
// if let image = image {
// let ciImage = CIImage(cgImage: image.cgImage!)
// let originImage = MTIImage(ciImage: ciImage, isOpaque: true)
// self.originInputImage = originImage
// self.imageView.image = originImage
// }
// }
if let image = croppedImage {
let ciImage = CIImage(cgImage: image.cgImage!)
let originImage = MTIImage(ciImage: ciImage, isOpaque: true)
originInputImage = originImage
imageView.image = originImage
}
let ciImage = CIImage(cgImage: croppedImage.cgImage!)
let originImage = MTIImage(ciImage: ciImage, isOpaque: true)
originInputImage = originImage
imageView.image = originImage

generateFilterThumbnailForAsset(asset)
generateFilterThumbnails()
setupNavigationButton()
}

private func setupNavigationBar() {
let luxImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 24, height: 24))
luxImageView.image = UIImage(named: "edit-luxtool")
navigationItem.titleView = luxImageView
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)

Expand Down Expand Up @@ -221,16 +208,15 @@ class PhotoEditorViewController: UIViewController {
allTools.append(FilterToolItem(type: .sharpen, slider: .zeroToHundred))
}

fileprivate func generateFilterThumbnailForAsset(_ asset: PHAsset) {
fileprivate func generateFilterThumbnails() {
DispatchQueue.global().async {
let options = PHImageRequestOptions()
options.isSynchronous = true
options.deliveryMode = .highQualityFormat
let targetSize = CGSize(width: 200, height: 200)
PHImageManager.default().requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFit, options: options) { (image, _) in
guard let image = image else {
return
}

let size = CGSize(width: 200, height: 200)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
self.croppedImage.draw(in: CGRect(origin: .zero, size: size))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
if let image = scaledImage {
for filter in self.allFilters {
let image = MTFilterManager.shard.generateThumbnailsForImage(image, with: filter)
self.thumbnails[filter.name] = image
Expand Down
40 changes: 40 additions & 0 deletions MetalFilters/Views/MTGridView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
//
// MTGridView.swift
// MetalFilters
//
// Created by xu.shuifeng on 2019/1/7.
// Copyright © 2019 shuifeng.me. All rights reserved.
//

import UIKit

class MTGridView: UIView {

override init(frame: CGRect) {
super.init(frame: frame)

let width = frame.width/3.0
let height = frame.height/3.0

let lineWidth = 1/UIScreen.main.scale

for row in 0...1 {
let line = UIView()
line.backgroundColor = UIColor(white: 1, alpha: 0.8)
line.frame = CGRect(x: 0, y: CGFloat(row + 1) * height, width: frame.width, height: lineWidth)
addSubview(line)
}

for col in 0...1 {
let line = UIView()
line.backgroundColor = UIColor(white: 1, alpha: 0.8)
line.frame = CGRect(x: CGFloat(col + 1) * width, y: 0, width: lineWidth, height: frame.height)
addSubview(line)
}
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

}
39 changes: 38 additions & 1 deletion MetalFilters/Views/MTScrollView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,41 @@ class MTScrollView: UIScrollView {
return view
}()

private var gridView: MTGridView!

override init(frame: CGRect) {
super.init(frame: frame)
addSubview(imageView)
delegate = self
contentInsetAdjustmentBehavior = .never
showsHorizontalScrollIndicator = false
showsVerticalScrollIndicator = false
delaysContentTouches = false

gridView = MTGridView(frame: bounds)
gridView.isUserInteractionEnabled = false
gridView.alpha = 0.0
addSubview(gridView)

let press = UILongPressGestureRecognizer(target: self, action: #selector(handlePress(_:)))
press.delegate = self
press.minimumPressDuration = 0
addGestureRecognizer(press)
}

@objc func handlePress(_ gesture: UILongPressGestureRecognizer) {
switch gesture.state {
case .began:
UIView.animate(withDuration: 0.2) {
self.gridView.alpha = 1.0
}
case .ended:
UIView.animate(withDuration: 0.2) {
self.gridView.alpha = 0.0
}
default:
break
}
}

required init?(coder aDecoder: NSCoder) {
Expand Down Expand Up @@ -93,9 +121,18 @@ class MTScrollView: UIScrollView {
}
}


extension MTScrollView: UIScrollViewDelegate {
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return imageView
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
gridView.frame = bounds
}
}

extension MTScrollView: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}

0 comments on commit 57dbd59

Please sign in to comment.