我正在尝试创建自定义下拉菜单。我的视图上将有几张卡片,点击它们时应该有一个下拉菜单。

现在,我将dropDownViewcardView.frame.maxY值设置为高度为0的frame.origin.y,当我点击卡片视图时,将dropDownView的高度设置为动画中的实际高度值。

但这看起来有点丑陋,因为它看起来像是无处不在。我希望它滑到哪里。

我的意思是,它立即具有其原始大小,并且位于卡片视图(cardView.frame.maxY = dropDownView.frame.maxY)下方,当轻按cardView时,dropDownView会在动画中向下滑动(dropDownView.frame.origin.y = cardView.frame.maxY)。

问题是dropDownView大于cardView。因此,当它位于cardView后面时,在cardView上方是可见的。我试图说明问题:)

这是状态A(在点击视图A [cardView]之前)(视图C只是一些背景视图,应该在视图A的上方和下方可见)

swift - 滑动UIView“无处不在”-LMLPHP

这是状态B(轻按cardView之后)

swift - 滑动UIView“无处不在”-LMLPHP

任何想法如何解决这个问题?谢谢!

另外,这里是一些示例代码:

class cardViewComplete: UIView {

    var card: CardView!
    var dropDownMenu: DropDownView!

required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    func initSubViews() {

        self.clipsToBounds = true

        card = CardView()
        card.frame = self.bounds
        card.addTarget(self, action: #selector(YellowTackleTicketComplete.ticketTapped), forControlEvents: .TouchDown)

        dropDownMenu = DropDownView()
        dropDownMenu.frame =  CGRect(x: 0, y: self.bounds.maxY, width: self.bounds.width, height: 350)
        dropDownMenu.hidden = true
        dropDownMenu.backgroundColor = UIColor.clearColor()

        self.addSubview(card)
        self.insertSubview(dropDownMenu, belowSubview: card)
dropDownMenu)
}

    func showDropdown() {
        dropDownMenu.hidden = false
        originalHeight = self.frame.size.height
        print("showing")
        if !animating {
            animating = true
            UIView.animateWithDuration(
                0.7,
                delay: 0,
                usingSpringWithDamping: 0.7,
                initialSpringVelocity: 0.5,
                options: [],
                animations: {
                    self.frame.size.height = self.frame.size.height + 350
                }, completion: { _ in
                    self.animating = false
                }
            )
        }
        self.setNeedsDisplay()
        self.dropDownMenu!.setNeedsDisplay()
        dropped = true
    }
    func ticketTapped() {

            showDropdown()
    }

}

最佳答案

我要做的是将视图A和视图B都放在一个新视图中,我们可以将其称为containerView。

containerView应该足够大以容纳A和B(当B向下移动时)。然后将containerView设置为限界。因此,当视图B处于“上”位置时,它既位于视图A的后面,又位于容器视图的顶部。因此根本看不到。

一旦您准备好将视图B降至其“向下”位置,就对其进行动画处理即可,它看起来似乎是从视图A的底部出来的。由于containerView的框架将向下延伸足够远,以容纳A和B(处于向下位置),不会剪切任何内容,并且两个视图均可见。

card = CardView()
card.frame = self.bounds
card.addTarget(self, action: #selector(YellowTackleTicketComplete.ticketTapped), forControlEvents: .TouchDown)

dropDownMenu = DropDownView()
// I changed the frame to place it right underneath the card view
dropDownMenu.frame =  CGRect(x: 0, y: card.frame.size.height - 350, width: self.bounds.width, height: 350)
dropDownMenu.hidden = true
dropDownMenu.backgroundColor = UIColor.clearColor()

let containerView = UIView()
containerView.frame = CGRect(x: 0, y: 0, width: bounds.width, height: card.frame.size.height + dropDownMenu.frame.size.height)
containerView.backgroundColor = nil
containerView.clipsAtBounds = true
containerView.addSubview(dropDownMenu)
containerView.addSubview(card)

关于swift - 滑动UIView“无处不在”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37615202/

10-12 02:34