1つのUISliderで複数のフィルターの色相変化をさせるには
カメラロールから選んだ画像をimageViewに描写している状態で、ボタンをタップするとセピア色や白黒にフィルターをかける機能を実装しています。
さらに、ユーザがUISliderを左右にドラッグしてセピア色や白黒の濃淡具合を選択できるような機能を実装したいと思い
独学でコーディングしたのですが、ここから先がわかりません。
import UIKit
class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
@IBOutlet var mainImageView: UIImageView!
@IBAction func pickImageFromLibrary() {
if UIImagePickerController.isSourceTypeAvailable(.PhotoLibrary) {
let controller = UIImagePickerController()
controller.delegate = self
controller.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
self.presentViewController(controller, animated: true, completion: nil)
}
}
override func viewDidLoad() {
super.viewDidLoad()
let slider = UISlider()
slider.frame = CGRect(x: 80, y: 380, width: 200, height: 40)
slider.minimumValue = 0.0
slider.maximumValue = 1.0
slider.addTarget(self, action: "sepiaFilter:", forControlEvents: UIControlEvents.ValueChanged)
slider.addTarget(self, action: "monoFilter:", forControlEvents: UIControlEvents.ValueChanged)
self.view.addSubview(slider)
}
func imagePickerController(picker: UIImagePickerController,
didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
self.mainImageView.image = image
(self.view.viewWithTag(1) as! UIButton).setImage(image, forState: .Normal)
(self.view.viewWithTag(2) as! UIButton).setImage(sepiaFilter(image, slider: UISlider()), forState: .Normal)
(self.view.viewWithTag(3) as! UIButton).setImage(monoFilter(image, slider: UISlider()), forState: .Normal)
picker.dismissViewControllerAnimated(true, completion: nil)
}
func sepiaFilter(image: UIImage, slider: UISlider) -> UIImage {
let sepiaFilter = CIFilter(name: "CISepiaTone")
sepiaFilter!.setDefaults()
let ciImage: CIImage = CIImage(image: image)!
sepiaFilter!.setValue(ciImage, forKey: kCIInputImageKey)
sepiaFilter!.setValue(slider.value, forKey: "inputIntensity")
if let outputImage = sepiaFilter!.valueForKey("outputImage") as? CIImage {
let manipulatedImage = UIImage(CIImage: outputImage)
self.mainImageView.image = manipulatedImage
}
return mainImageView.image!
}
func monoFilter(image: UIImage, slider: UISlider) -> UIImage {
let monoFilter = CIFilter(name: "CIColorControls")
monoFilter!.setDefaults()
let ciImage = CIImage(image: image)!
monoFilter!.setValue(ciImage, forKey: kCIInputImageKey)
monoFilter!.setValue(slider.value, forKey: "inputSaturation")
if let outputImage = monoFilter!.valueForKey("outputImage") as? CIImage {
let manipulatedImage = UIImage(CIImage: outputImage)
self.mainImageView.image = manipulatedImage
}
return mainImageView.image!
}
@IBAction func filterTapped(sender:UIButton) {
switch sender.tag {
case 1:
mainImageView.image = (self.view.viewWithTag(1) as! UIButton).imageView?.image
case 2:
mainImageView.image = (self.view.viewWithTag(2) as! UIButton).imageView?.image
default:
break
}
}
}
上記のコードで実機テストをすると、UISliderをドラッグしたときにエラーとなります。
(ビルド前の、エラーマークは無い状態です)
UISlider作成するときのaddTarget()の括弧内で、action: "sepiaFilter:"と"monoFilter:"
を混在させているため、エラーになっていると思うのですが、
文法的にどういった記述をして修正すべきでしょうか。