gpt4 book ai didi

swift - 使图像滑动并返回到容器内的原始位置。自定义 slider swift

转载 作者:可可西里 更新时间:2023-11-01 01:50:38 29 4
gpt4 key购买 nike

我正在尝试创建一个自定义 slider ,以便用户可以滑动以执行操作, slider 已完成,但我遇到一个问题,即当我决定完全展开 View 时,我必须始终重新调整值。 slider 图像有时会滑出所需的基本 View 。

我如何修改此代码以确保滑动图像不会超出容器 View 并返回到其原始位置。

private func swipeFunc() {
let swipeGesture = UIPanGestureRecognizer(target: self, action: #selector(acknowledgeSwiped(sender:)))
swipeImage.addGestureRecognizer(swipeGesture)
swipeImage.isUserInteractionEnabled = true
swipeGesture.delegate = self as? UIGestureRecognizerDelegate
}

@objc func acknowledgeSwiped(sender: UIPanGestureRecognizer) {
let minAdjust: CGFloat = 160
let maxAdjust: CGFloat = 72
if let sliderView = sender.view {
if sender.state == UIGestureRecognizer.State.began || sender.state == UIGestureRecognizer.State.changed {
let translation = sender.translation(in: self.view)
if sliderView.center.x >= (swipeView.center.x - minAdjust) && sliderView.center.x <= (swipeView.center.x + maxAdjust) {
sliderView.center.x = sliderView.center.x + translation.x
} else if sliderView.center.x >= (swipeView.center.x + maxAdjust) {
sliderView.center.x = swipeView.center.x + maxAdjust

// dismiss(animated: true, completion: nil)
} else {
sliderView.center.x = swipeView.center.x - minAdjust
}

sender.setTranslation(CGPoint.zero, in: self.view)
} else if sender.state == UIGestureRecognizer.State.ended {
UIView.animate(withDuration: 0.1, animations: {
sliderView.center.x = self.swipeView.center.x - minAdjust
})
}
}
}

最佳答案

您可以尝试使用 CGAffineTransform 而不是更改框架,最好的是您可以轻松地将其发送到原始位置。

更新:添加了边缘检测,您可以添加您需要的逻辑来关闭。

class ViewController: UIViewController {
@IBOutlet weak var swipeView: UIView!
@IBOutlet weak var swipeImage: UIImageView!

override func viewDidLoad() {
super.viewDidLoad()
swipeFunc()
}

private func swipeFunc() {
let swipeGesture = UIPanGestureRecognizer(target: self, action: #selector(acknowledgeSwiped(sender:)))
swipeImage.addGestureRecognizer(swipeGesture)
swipeImage.isUserInteractionEnabled = true
swipeGesture.delegate = self as? UIGestureRecognizerDelegate
}

var startingFrame: CGRect?
@objc func acknowledgeSwiped(sender: UIPanGestureRecognizer) {
if let sliderView = sender.view {
let translation = sender.translation(in: swipeView)
switch sender.state {
case .began:
startingFrame = swipeImage.frame
fallthrough
case .changed:
if let startFrame = startingFrame {

var movex = translation.x
if movex < -startFrame.origin.x { movex = -startFrame.origin.x }

let xMax = swipeView.frame.width - startFrame.origin.x - startFrame.width
if movex > xMax { movex = xMax }

var movey = translation.y
if movey < -startFrame.origin.y { movey = -startFrame.origin.y }

let yMax = swipeView.frame.height - startFrame.origin.y - startFrame.height
if movey > yMax { movey = yMax }

sliderView.transform = CGAffineTransform(translationX: movex, y: movey)

let sliderCenter = CGPoint(x: swipeImage.frame.midX, y: swipeImage.frame.midY)
if !swipeView.bounds.insetBy(dx: 70, dy: 70).contains(sliderCenter) {
swipeView.backgroundColor = .red
} else {
swipeView.backgroundColor = .blue
}
}
default: // .ended and others:
UIView.animate(withDuration: 0.1, animations: {
sliderView.transform = CGAffineTransform.identity
})
}
}
}
}

关于swift - 使图像滑动并返回到容器内的原始位置。自定义 slider swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54517930/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com