从UIStackView拖动和删除UIView,但将其保留在其放置目标上

时间:2016-08-24 22:15:21

标签: swift uistackview

我在堆栈视图中有很多视图,它们是可拖动的。我希望在拖放操作后从拖放视图中删除拖动的视图。我希望在拖放操作后重新组织堆栈视图。

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)

此代码用于删除视图并调整其大小。没有" removeArrangedSubview"它按预期工作,但如果我使用" removeArrangedSubview"我正在拖放的视图没有放在正确的点上,它会自行调整大小。

1 个答案:

答案 0 :(得分:2)

  1. 您需要继承 UIStackView

  2. 你需要继承你要拖动的对象类型,并且在那个类中 为UIStackView的子类创建一个委托协议以符合

      protocol objetMovedDelgateProtocol {
      func card(card:Cardview, didDragFromPoint initialPoint:CGPoint, toPoint   point:CGPoint)
            }
    
  3. 3.在您要拖动的对象中,从它的类中,将对象中心点发送给委托,以配置该点是否在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
    
                ......
                ......
    
            } 
    }
    
    1. 不要将带有autolayout constarint的对象插入到StackView中 它将开始表现不可预测

    2. 我得出结论(就像你在gif图片中看到的那样)试图用StackView做这样的事情是非常错误的,而且是不可预测的,所以我想我会说出这个想法。 (因为我也想这样使用它。)

    3. StackView