Я следовал этим 2 урокам tutsplus и appcoda
У меня есть изображение внутри vc1, которое я передаю vc2.vc2 имеет два imageViews: originalImageView
, который показывает исходное изображение из vc1 и filteredImageView
, который показывает новое изображение с примененными основными фильтрами изображений.filteredImageView
привязан поверх originalImageView
У меня также есть scrollView, в котором я создаю фильтры coreImage с кнопками, после нажатия кнопки новый фильтр применяется, и отфильтрованное изображение теперь отображается внутриfilteredImageView
, который скрывает originalImageView
, поскольку он находится под ним.
Как только пользователь нажимает любую из кнопок, которые содержат фильтр, он не может вернуться к исходному изображению.
Как создать кнопку, которая показывает исходное изображение внутри scrollView, которое соответствует всем отфильтрованным изображениям?В идеале это было бы самое первое изображение, так что, как только пользователь нажимает на него, отображается оригинальное изображение
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
}