我正在尝试创建自定义下拉菜单。我的视图上将有几张卡片,点击它们时应该有一个下拉菜单。
现在,我将dropDownView
的cardView.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的上方和下方可见)
这是状态B(轻按cardView之后)
任何想法如何解决这个问题?谢谢!
另外,这里是一些示例代码:
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/