gpt4 book ai didi

ios - 仅在其父 View 内拖动 UIImageView

转载 作者:搜寻专家 更新时间:2023-11-01 06:52:07 24 4
gpt4 key购买 nike

假设我有:

  • 一个名为 foxUIImageView
  • 父 ImageView 称为 fence
  • 掌握UIView默认嵌入ViewControllers

现在换句话说,我希望fox 只在它的fence 内移动

在我的 viewDidLoad() 中:

override func viewDidLoad() {
super.viewDidLoad()

view.addSubview(fence)
fence.addSubview(fox)

}

现在这部分工作正常,我想通过对 UIImageView 进行子类化并进行一些修改来移动 fox:

class DraggableImageView: UIImageView {


var dragStartPositionRelativeToCenter : CGPoint?

override init(image: UIImage!) {
super.init(image: image)

self.isUserInteractionEnabled = true

addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(handlePan(nizer:))))

layer.shadowColor = UIColor.black.cgColor
layer.shadowOffset = CGSize(width: 0, height: 3)
layer.shadowOpacity = 0.5
layer.shadowRadius = 2
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

@objc func handlePan(nizer: UIPanGestureRecognizer!) {
if nizer.state == UIGestureRecognizer.State.began {
let locationInView = nizer.location(in: superview)
dragStartPositionRelativeToCenter = CGPoint(x: locationInView.x - center.x, y: locationInView.y - center.y)

layer.shadowOffset = CGSize(width: 0, height: 20)
layer.shadowOpacity = 0.3
layer.shadowRadius = 6

return
}

if nizer.state == UIGestureRecognizer.State.ended {
dragStartPositionRelativeToCenter = nil

layer.shadowOffset = CGSize(width: 0, height: 3)
layer.shadowOpacity = 0.5
layer.shadowRadius = 2

return
}

let locationInView = nizer.location(in: superview)

UIView.animate(withDuration: 0.1) {
self.center = CGPoint(x: locationInView.x - self.dragStartPositionRelativeToCenter!.x,
y: locationInView.y - self.dragStartPositionRelativeToCenter!.y)
}
}}

现在我可以将 fox 对象拖到任何我喜欢的地方,但是;如果我只想移动 fence 对象内的 fox 怎么办?因为它是一个 subview ,我认为这是可能的。

最佳答案

为了将 ImageView 保留在其父 View 中,我在更新 View 中心之前添加了一个检查,以确保 View 框架位于父框架中。仅当更新将 View 保持在其父框架内时,中心才会更新。

我还更新了平移处理程序以使用翻译(类似于平移手势 documentation 中的示例)而不是 locationInView。这使得拖动表现得更好。

我已经对此进行了测试,我相信它会以您想要的方式运行。希望这有助于:

    @objc func handlePan(nizer: UIPanGestureRecognizer!) {
if nizer.state == UIGestureRecognizer.State.began {
dragStartPositionRelativeToCenter = self.center
layer.shadowOffset = CGSize(width: 0, height: 20)
layer.shadowOpacity = 0.3
layer.shadowRadius = 6

return
}

if nizer.state == UIGestureRecognizer.State.ended {
dragStartPositionRelativeToCenter = nil

layer.shadowOffset = CGSize(width: 0, height: 3)
layer.shadowOpacity = 0.5
layer.shadowRadius = 2

return
}

if let initialCenter = dragStartPositionRelativeToCenter {
let translation = nizer.translation(in: self.superview)
let newCenter = CGPoint(x: initialCenter.x + translation.x, y: initialCenter.y + translation.y)
if frameContainsFrameFromCenter(containingFrame: superview!.frame, containedFrame: self.frame, center: newCenter) {
UIView.animate(withDuration: 0.1) {
self.center = newCenter
}
}

}
}

func frameContainsFrameFromCenter(containingFrame: CGRect, containedFrame: CGRect, center: CGPoint) -> Bool {
let leftMargin = containedFrame.width / 2
let topMargin = containedFrame.height / 2
let testFrame = CGRect(
x: leftMargin,
y: topMargin,
width: containingFrame.width - (2*leftMargin),
height: containingFrame.height - (2*topMargin)
)
return testFrame.contains(center)
}

关于ios - 仅在其父 View 内拖动 UIImageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56495311/

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