2016-07-26 11 views
2

Wenn ich eine Ansichtskonfiguration in meinem Storyboard eingerichtet habe, gibt es eine Möglichkeit, dass diese Ansicht (mit benutzerdefinierter Breite und Höhe) von unten nach oben auf dem Bildschirm angezeigt wird, wenn eine Taste gedrückt wird? Ich möchte, dass der Bildschirm nur überlagert wird (so dass Sie immer noch in der Lage wären, Dinge auf dem Bildschirm darunter zu drücken).View Slide von unten in Swift?

Wie würde ich das einrichten?

func isChecked(){ 

    let window = UIApplication.sharedApplication().keyWindow 

    window!.addSubview(collectionView) 
    let height: CGFloat = 250 
    let y = window!.frame.height - 250 
    collectionView.frame = CGRect(x: 0, y: window!.frame.height, width: window!.frame.width, height: height) 

    UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .CurveEaseOut, animations: { 
     self.collectionView.frame = CGRectMake(0, y, self.collectionView.frame.width, self.collectionView.frame.height) 
     }, completion: nil) 
} 

func isUnchecked(){ 
    let window = UIApplication.sharedApplication().keyWindow 
    UIView.animateWithDuration(0.3, animations: { 
     self.collectionView.frame = CGRectMake(0, window!.frame.height, self.collectionView.frame.width, self.collectionView.frame.height) 
    }) 
} 

Gibt es eine Möglichkeit, die ich erreichen kann, was ich oben tue, außer im Hinblick auf die ich in meinem Storyboard erstellen?

+0

Was Sie versucht haben? Dies kann auf viele Arten geschehen, mit Frames oder Auto-Layout, UIView-Animationen, usw. – paulvs

+0

Es gibt keinen Standard-Übergangsstil, der Ihnen diesen Effekt bietet. – David

+0

@paulvs sehe den Code, den ich oben hinzugefügt habe - wie kann ich eine Storyboardansicht verknüpfen, um die 'collectionView' zu ersetzen, die ich jetzt verwende –

Antwort

5

Ich habe eine kleine Demo für Sie gemacht: neues Projekt erstellt und schrieb diesen Code in ViewController.swift, nichts mehr. Denken Sie es

import UIKit 

class ViewController: UIViewController { 

    let collectionView: UICollectionView = { 
     let frame = CGRect(x: 0, y: 50, width: UIScreen.mainScreen().bounds.size.width, height: UIScreen.mainScreen().bounds.size.height - 50) 
     let col = UICollectionView(frame: frame, collectionViewLayout: UICollectionViewFlowLayout()) 
     col.layer.borderColor = UIColor.redColor().CGColor 
     col.layer.borderWidth = 1.0 
     col.backgroundColor = UIColor.yellowColor() 
     return col 
    }() 

    let switchView = UISwitch() 

    func switched(s: UISwitch){ 
     let origin: CGFloat = s.on ? view.frame.height : 50 
     UIView.animateWithDuration(0.35) { 
      self.collectionView.frame.origin.y = origin 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     switchView.frame = CGRect(x: 0, y: 20, width: 40, height: 20) 
     switchView.addTarget(self, action: #selector(switched), forControlEvents: .ValueChanged) 

     view.addSubview(switchView) 
     view.addSubview(collectionView) 

    } 

} 
1

SwiftStudier Antwort aktualisiert Swift 3 hilft:

import UIKit 

class ViewController: UIViewController { 

    let collectionView: UICollectionView = { 
     let frame = CGRect(x: 0, y: 50, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height - 50) 
     let col = UICollectionView(frame: frame, collectionViewLayout: UICollectionViewFlowLayout()) 
     col.layer.borderColor = UIColor.red.cgColor 
     col.layer.borderWidth = 1.0 
     col.backgroundColor = UIColor.yellow 
     return col 
    }() 

    let switchView = UISwitch() 

    func switched(s: UISwitch){ 
     let origin: CGFloat = s.isOn ? view.frame.height : 50 
     UIView.animate(withDuration: 0.35) { 
      self.collectionView.frame.origin.y = origin 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     switchView.frame = CGRect(x: 0, y: 20, width: 40, height: 20) 
     switchView.addTarget(self, action: #selector(switched), for: .valueChanged) 

     view.addSubview(switchView) 
     view.addSubview(collectionView) 
    } 
}