【发布时间】:2018-09-10 20:33:31
【问题描述】:
我在 vc1 中有一个图像,我将其传递给 vc2。 vc2 有两个 imageViews:originalImageView 显示来自 vc1 的原始图像,filteredImageView 显示应用了核心图像过滤器的新图像。 filteredImageView 锚定在 originalImageView 之上
我还有一个滚动视图,我使用 as 按钮创建 coreImage 过滤器,一旦按下按钮,就会应用新过滤器,过滤后的图像现在显示在 filteredImageView 内,它隐藏了 originalImageView,因为它位于它。
一旦用户按下任何包含过滤器的按钮,他们就无法返回到原始图像。
如何创建一个按钮来显示滚动视图中的原始图像以及所有过滤后的图像?理想情况下,它将是第一张图片,这样一旦用户按下它,就会显示原始图片
let originalImageView: UIImageView = {
let imageView = UIImageView()
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.contentMode = .scaleAspectFill
return imageView
}()
let filteredImageView: UIImageView = {
let imageView = UIImageView()
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.contentMode = .scaleAspectFill
return imageView
}()
let scrollView: UIScrollView = {
let scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.backgroundColor = .black
return scrollView
}()
var originalImage: UIImage? // set from vc1
let ciFilterNames = [
"CISharpenLuminance",
"CIPhotoEffectChrome",
"CIPhotoEffectFade",
"CIPhotoEffectInstant",
"CIPhotoEffectNoir",
"CIPhotoEffectProcess",
"CIPhotoEffectTonal",
"CIPhotoEffectTransfer",
"CISepiaTone"
]
override func viewDidLoad() {
super.viewDidLoad()
createAnchors()
guard let originalImage = originalImage else { return }
originaImage.image = originalImage
var xCoord: CGFloat = 5
let yCoord: CGFloat = 5
let buttonWidth:CGFloat = 70
let buttonHeight: CGFloat = 70
let gapBetweenButtons: CGFloat = 5
var itemCount = 0
for i in 0..<ciFilterNames.count {
itemCount = i
let filterButton = UIButton(type: .custom)
button.frame = CGRect(x: xCoord, y: yCoord, width: buttonWidth, height: buttonHeight)
filterButton.tag = itemCount
filterButton.addTarget(self, action: #selector(filterButtonPressed(_:)), for: .touchUpInside)
filterButton.layer.cornerRadius = 7
filterButton.clipsToBounds = true
guard let openGLContext = EAGLContext(api: .openGLES3) else { return }
let context = CIContext(eaglContext: openGLContext)
// Create filters for each button
let coreImage = CIImage(image: originalImage)
let filter = CIFilter(name: "\(ciFilterNames[i])" )
filter?.setDefaults()
filter?.setValue(coreImage, forKey: kCIInputImageKey)
if ciFilterNames[i] == "CISharpenLuminance" {
filter?.setValue(0.8, forKey: kCIInputSharpnessKey)
} else {
filter?.setValue(1, forKey: kCIInputIntensityKey)
}
guard let output = filter?.value(forKey: kCIOutputImageKey) as? CIImage else { return }
guard let cgimgresult = context.createCGImage(output, from: output.extent) else { return }
let imageForButton = UIImage(cgImage: cgimgresult)
filterButton.setBackgroundImage(imageForButton, for: .normal)
// Add Buttons in the Scroll View
xCoord += buttonWidth + gapBetweenButtons
scrollView.addSubview(filterButton)
}
}
@objc fileprivate func filterButtonPressed(_ sender: UIButton) {
let button = sender as UIButton
filteredImageView.image = button.backgroundImage( for: .normal)
}
func createAnchors() {
view.addSubview(originalImageView)
view.addSubview(filteredImageView)
view.addSubview(scrollView)
originalImageView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
originalImageView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
originalImageView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
originalImageView.widthAnchor.constraint(equalToConstant: view.frame.width).isActive = true
originalImageView.heightAnchor.constraint(equalToConstant: view.frame.width).isActive = true
filteredImageView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
filteredImageView.leadingAnchor.constraint(equalTo: originalImageView.leadingAnchor).isActive = true
filteredImageView.widthAnchor.constraint(equalTo: originalImageView.widthAnchor).isActive = true
filteredImageView.heightAnchor.constraint(equalTo: originalImageView.heightAnchor).isActive = true
scrollView.topAnchor.constraint(equalTo: originalImageView.bottomAnchor, constant: 8).isActive = true
scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
scrollView.heightAnchor.constraint(equalToConstant: 80).isActive = true
}
【问题讨论】:
-
您不需要有两个重叠的图像视图。相反,您可能只有一个图像视图并保留两个图像。要更改当前图像,请使用 UIImageView 的“图像”属性
-
是有道理的,但是一旦应用了过滤器并且用户想要回到原来的图像,我该如何回到原始图像?
-
将原始图像存储在 var 中,并在您想要重置时将其设置回来
-
@Sh_Khan 问题是原始图像未与过滤器一起显示。我可以添加一个 barButtonItem,它会在按下时将其还原,但它看起来很奇怪,而不是显示原始图像和过滤后的图像。顺便说一句,将原始图像保存在一个完全独立的属性中是个好主意
-
关于滚动。尝试 UITableView,其中每个图像都是一个单元格。
标签: ios swift uibutton uiimageview core-image