你好我已经创建了一个Class,这个类允许用户自拍,之后用户可以选择他想要的过滤器,但问题是,我能够拍摄照片之后,原始图像出现在屏幕的顶部,但是具有相同图像的按钮位于不同的位置,我的意思是按钮中的照片被翻转,我想将图像保持在原始位置。这是我的代码,我将添加一个屏幕图像,您将看到发生了什么。
感谢。 Image example
import UIKit
import SVProgressHUD
var filteredImage: UIImage!
class SelectFilterViewController: UIViewController {
@IBOutlet weak var originalImage: UIImageView!
@IBOutlet weak var imageToFilter: UIImageView!
@IBOutlet weak var mainView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
//var imageToShow = photo
var CIFilterNames = [
"CIPhotoEffectChrome",
"CIPhotoEffectFade",
"CIPhotoEffectInstant",
"CIPhotoEffectNoir",
"CIPhotoEffectProcess",
"CIPhotoEffectTonal",
"CIPhotoEffectTransfer",
"CISepiaTone"
]
override func viewDidLoad() {
super.viewDidLoad()
SVProgressHUD.dismiss()
originalImage.image = photo
var xCoord: CGFloat = 5
let yCoord: CGFloat = 5
let buttonWidth:CGFloat = 80
let buttonHeight: CGFloat = 80
let gapBetweenButtons: CGFloat = 5
var itemCount = 0
for i in 0..<CIFilterNames.count {
itemCount = i
// Button properties
let filterButton = UIButton(type: .custom)
filterButton.frame = CGRect(x: xCoord, y: yCoord, width: buttonWidth, height: buttonHeight)
filterButton.tag = itemCount
// filterButton.addTarget(self, action: #selector(ViewController.filterButtonTapped(_:)), for: .touchUpInside)
filterButton.addTarget(self, action:#selector(filterButtonTapped), for: .touchUpInside)
filterButton.layer.cornerRadius = 6
filterButton.clipsToBounds = true
let ciContext = CIContext(options: nil)
let coreImage = CIImage(image: originalImage.image!)
let filter = CIFilter(name: "\(CIFilterNames[i])" )
filter!.setDefaults()
filter!.setValue(coreImage, forKey: kCIInputImageKey)
let filteredImageData = filter!.value(forKey: kCIOutputImageKey) as! CIImage
let filteredImageRef = ciContext.createCGImage(filteredImageData, from: filteredImageData.extent)
let imageForButton = UIImage(cgImage: filteredImageRef!)
filterButton.setBackgroundImage(imageForButton, for: .normal)
xCoord += buttonWidth + gapBetweenButtons
scrollView.addSubview(filterButton)
}
scrollView.contentSize = CGSize(width: buttonWidth * CGFloat(itemCount+2), height: yCoord)
}
func filterButtonTapped(sender: UIButton) {
let button = sender as UIButton
imageToFilter.image = button.backgroundImage(for: UIControlState.normal)
}
func createTheAlertForEmptyImage() {
let alert = UIAlertController(title: "xxxxx", message: "xxxxx", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "xxxxx", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
@IBAction func clickSaveButton(_ sender: Any) {
if self.imageToFilter.image == nil {
createTheAlertForEmptyImage()
} else {
filteredImage = self.imageToFilter.image!
UIImageWriteToSavedPhotosAlbum(imageToFilter.image!, nil, nil, nil)
}
let alert = UIAlertController(title: "xxxx", message: "xxxxx", preferredStyle: UIAlertControllerStyle.alert)
let action = UIAlertAction(title: "xxxxx", style: .default) { (action) -> Void in
let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc: UIViewController = storyboard.instantiateViewController(withIdentifier: "CaptureViewController") as! CaptureViewController
self.present(vc, animated: true, completion: nil)
}
alert.addAction(action)
self.present(alert, animated: true, completion: nil)
}
let finalImage = filteredImage
override var prefersStatusBarHidden: Bool {
return true
}
}