2016-06-03 2 views
0

Я пытаюсь создать настраиваемое раскрывающееся меню. У меня будет несколько карт на моем представлении, которые должны иметь раскрывающееся меню при нажатии.Скользящий UIView «Из ниоткуда»

Прямо сейчас я имею в dropDownView имея cardView.frame.maxY как его frame.origin.y значения с высотой 0, и когда я нажимаю на вид карты я установить высоту dropDownView его реальную высоту стоимость в анимации.

Но это выглядит как уродливое, так как похоже, что оно выходит из ниоткуда. Я хочу, чтобы он скользнул из ниоткуда.

Под этим я имею в виду, что имеет свой оригинальный размер сразу и сидя под видом карты (cardView.frame.maxY = dropDownView.frame.maxY) Когда cardView сливают в dropDownView скользит вниз (dropDownView.frame.origin.y = cardView.frame.maxY) в анимации.

Проблема в том, что dropDownView больше, чем cardView. Поэтому, когда он сидит за cardView, он отображается над cardView. Я попытался проиллюстрировать проблему :)

Это состояние A (До View A [cardView] сливают) (View C лишь некоторые предпосылки View, которая должна быть видна сверху и снизу View A)

enter image description here

Это состояние B (после cardView касании)

enter image description here

Любые идеи, как решить эту проблему? Спасибо!

В дополнение Heres немного образец кода:

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() 
    } 

} 
+0

Вы могли бы просто поместить viewB за viewC? так что он будет покрыт им до того, как будет затронут ViewA. –

+0

Привет, Альберто, им жаль, я думаю, что мой второй рисунок немного раздражает. Вид C не должен заканчиваться в нижней части окна A. Предполагается, что это будет общий фон. Прямо сейчас я экспериментирую с clipToBounds = true. Но до сих пор мне не удавалось сгладить слайд вниз/вверх анимации. – weka1

+0

Я не понимаю вашу проблему, я думаю:/... поэтому, когда вы касаетесь вида A, вы хотите, чтобы viewB переместился? (если вы установите представление с помощью clipToBounds = true, то внутри него будут невидимы внешние объекты) –

ответ

1

Что я хотел бы сделать это место как View A и B Просмотр в новой точки зрения, мы можем назвать это containerView.

containerView должен быть достаточно большим, чтобы удерживать как A, так и B (когда B перемещается вниз). Затем установите containerView для клипа на границах. Поэтому, когда View B находится в позиции «вверх», он сидит как за View A, так и подстрижен в верхней части контейнера. Поэтому его вообще не видно.

После того, как вы будете готовы к просмотру B, чтобы перейти в положение «вниз», просто оставьте его вниз, где он появится, чтобы выйти из нижней части View 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) 
+0

Звучит неплохо! Спасибо, Натан! Я дам ему попробовать! – weka1

+0

Спасибо снова! Вы решили мою проблему! – weka1

Смежные вопросы