图像编辑应用程序。它可以缩放图像与pinchGesture,旋转它与rotateGesture和拖动从角落来调整图像大小。图像附近有2个按钮。一个旋转按钮-这一个触发图像的旋转,和一个删除图像按钮。
现在,当我收缩或旋转按钮时,按钮不再位于图像的右侧。约束正在被破坏。以下是破坏约束后的外观:
这是如果一切都好
private let imageView: UIImageView = {
let imageView = UIImageView()
let bundlePath = Bundle.main.path(forResource: "lockscreen", ofType: "jpeg")
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.image = UIImage(contentsOfFile: bundlePath ?? "")
imageView.isUserInteractionEnabled = true
imageView.contentMode = .scaleToFill
imageView.clipsToBounds = false
return imageView
}()
private let rotateButton: UIButton = {
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
let newSize = CGSize(width: 25, height: 25)
let image = UIImage(systemName: "rotate.left")
let resizedImage = image?.withConfiguration(UIImage.SymbolConfiguration(pointSize: newSize.width, weight: .medium))
button.setImage(resizedImage, for: .normal)
button.tintColor = .systemPink
button.isHidden = true
return button
}()
private let deleteButton: UIButton = {
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
let newSize = CGSize(width: 25, height: 25)
let image = UIImage(systemName: "trash")
let resizedImage = image?.withConfiguration(UIImage.SymbolConfiguration(pointSize: newSize.width, weight: .medium))
button.setImage(resizedImage, for: .normal)
button.tintColor = .systemPink
button.isHidden = true
return button
}()
private var topLeftCircleView = CircleView()
private var topRightCircleView = CircleView()
private var bottomLeftCircleView = CircleView()
private var bottomRightCircleView = CircleView()
private var borderView = UIView()
private var imageViewTopConstraint: NSLayoutConstraint!
private var imageViewBottomConstraint: NSLayoutConstraint!
private var imageViewLeftConstraint: NSLayoutConstraint!
private var imageViewRightConstraint: NSLayoutConstraint!
private var rotateButtonBottomAnchorConstraint: NSLayoutConstraint!
private var rotateButtonTrailingAnchorConstraint: NSLayoutConstraint!
private var deleteButtonTopAnchorConstraint: NSLayoutConstraint!
private var deleteButtonTrailingAnchorConstraint: NSLayoutConstraint!
private var isResizing: Bool = false {
didSet {
[topLeftCircleView, topRightCircleView, bottomLeftCircleView, bottomRightCircleView, rotateButton, deleteButton].forEach { $0.isHidden = !isResizing }
borderView.layer.borderWidth = isResizing ? 2.0 : 0.0
}
}
private var originalImageFrame: CGRect = .zero
private var resizeRect = ResizeRect()
private var proxyFactor: CGFloat = 10.0
private var rotationGesture: UIRotationGestureRecognizer!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
setupView()
addConstraintsForItems()
createCircles()
addTapGestureRecognizer()
addPinchGestureRecognizer()
addRotationGesture()
addDeletePhotoButton()
}
这是设置代码,以防万一您可能需要它。这里是约束代码:
private func addConstraintsForItems() {
imageViewTopConstraint = imageView.topAnchor.constraint(equalTo: view.topAnchor, constant: 180)
imageViewBottomConstraint = view.bottomAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 180)
imageViewLeftConstraint = imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 60)
imageViewRightConstraint = view.trailingAnchor.constraint(equalTo: imageView.trailingAnchor, constant: 70)
NSLayoutConstraint.activate([imageViewTopConstraint, imageViewBottomConstraint, imageViewLeftConstraint, imageViewRightConstraint])
let borderViewTopConstraint = borderView.topAnchor.constraint(equalTo: imageView.topAnchor)
let borderViewLeftConstraint = borderView.leadingAnchor.constraint(equalTo: imageView.leadingAnchor)
let borderViewRightConstraint = borderView.trailingAnchor.constraint(equalTo: imageView.trailingAnchor)
let borderViewBottomConstraint = borderView.bottomAnchor.constraint(equalTo: imageView.bottomAnchor)
NSLayoutConstraint.activate([borderViewTopConstraint, borderViewLeftConstraint, borderViewRightConstraint, borderViewBottomConstraint])
rotateButtonBottomAnchorConstraint = rotateButton.centerYAnchor.constraint(equalTo: imageView.centerYAnchor, constant: -20)
rotateButtonTrailingAnchorConstraint = rotateButton.trailingAnchor.constraint(equalTo: imageView.trailingAnchor, constant: 40)
NSLayoutConstraint.activate([rotateButtonBottomAnchorConstraint, rotateButtonTrailingAnchorConstraint])
deleteButtonTopAnchorConstraint = deleteButton.centerYAnchor.constraint(equalTo: imageView.centerYAnchor, constant: 20)
deleteButtonTrailingAnchorConstraint = deleteButton.trailingAnchor.constraint(equalTo: imageView.trailingAnchor, constant: 40)
NSLayoutConstraint.activate([deleteButtonTopAnchorConstraint, deleteButtonTrailingAnchorConstraint])
}
下面是如何放大和旋转图像:
@objc private func handlePincheGesture(_ gestureRecognizer: UIPinchGestureRecognizer) {
if gestureRecognizer.state == .began {
isResizing = false
}
gestureRecognizer.view?.transform = (gestureRecognizer.view?.transform)!.scaledBy(x: gestureRecognizer.scale, y: gestureRecognizer.scale)
gestureRecognizer.scale = 1.0
if gestureRecognizer.state == .ended {
isResizing = true
}
}
@objc private func handleRotationGesture(_ gestureRecognizer: UIRotationGestureRecognizer) {
if gestureRecognizer.state == .began {
isResizing = false
}
if let view = gestureRecognizer.view {
view.transform = view.transform.rotated(by: gestureRecognizer.rotation)
gestureRecognizer.rotation = 0
}
if gestureRecognizer.state == .ended {
isResizing = true
}
}
我应该怎么做才能正确放置按钮?
1条答案
按热度按时间0sgqnhkj1#
我提出了一个解决方案,仍然需要改进,但这是一个很好的开始,基本上你需要添加这些按钮到stackView,添加这个stackView到视图,约束它就像图像一样。之后,在rotation方法中,你可以添加一行,在你转换视图的同时也转换stackView。
另外,如果你需要捏图像,你可以使用相同的逻辑,并除以2的比例捏,使按钮不会变得很大,但再次,这仍然需要改进。