我在堆栈 View 中有一堆 View ,它们是可拖动的。我希望在拖放操作后从堆栈 View 中删除拖动的 View 。我希望在拖放操作后重新组织我的堆栈 View 。
self.stackView.removeArrangedSubview(sender.view!)
这段代码有效,但它破坏了这段代码
sender.view!.center = referenceView.convertPoint(CGPoint(x: dropAreaLeft.midX, y: dropAreaLeft.midY), toView: sender.view!.superview)
sender.view!.frame = CGRectMake(sender.view!.frame.origin.x, sender.view!.frame.origin.y, sender.view!.frame.width * 0.5, sender.view!.frame.height * 0.5)
此代码用于删除 View 并调整其大小。如果没有“removeArrangedSubview”,它会按预期工作,但如果我使用“removeArrangedSubview”,我拖/放的 View 不会被放在正确的点上,它会自行调整大小。
最佳答案
您需要继承 UIStackView
您需要子类化您正在拖动的对象类型,并在该类中 为 UIStackView 的子类创建一个委托(delegate)协议(protocol)以符合
protocol objetMovedDelgateProtocol { func card(card:Cardview, didDragFromPoint initialPoint:CGPoint, toPoint point:CGPoint) }
3.在您拖动的对象中,从它的类中,将对象中心点发送到委托(delegate)以配置该点是否在 stackView 内,并且 你想相应地做什么
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
if delegate != nil {
delegate?.card(self, didDragFromPoint: origin, toPoint: self.center)
}
}
在delagete你做这样的事情:
func card(card:Cardview, didDragFromPoint initialPoint:CGPoint, toPoint point:CGPoint){
if(!CGRectContainsPoint(self.frame, point)) && card.isObjecInStackView{
print("object was removed successfully from the stack view")
......
......
}
if(CGRectContainsPoint(self.frame, point)) && !card.isObjecInStackView{
print("object was added successfully to the stack view")
let constraints = card.constraints
card.removeConstraints(constraints)
self.addArrangedSubview(card)
self.bringSubviewToFront(card)
card.isObjecInStackView = true
......
......
}
}
不要将具有自动布局约束的对象插入 StackView 它将开始表现出不可预测性
我已经得出结论(就像您在 gif 图像中看到的那样)尝试使用 StackView 做这样的事情是非常错误的,而且不可预测,所以我想我会放弃这个想法。 .(因为我也想那样用。)
关于swift - 从 UIStackView 中拖动和删除 UIView 但将其保留在其放置目的地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133835/