2016-03-03 3 views
0

ViewController о котором идет речь, внедренные в UINavigationController и представлены в виде .FormSheet следующим образом:Override Formsheet Размер-Классы

class PLViewController:UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     navigationController?.navigationBar.translucent = false 
    } 

    /// Embeds self into a UINavigationController, adds a "done" button to the navVC and uses the passed ViewController to present self embedded in the NavigationController. 
    /// - Parameters: 
    ///  - presentingVC: ViewController which will present the formSheet. 
    ///  - animated: If TRUE, the presentation of the formsheet will be animated. 
    func presentAsFormSheet (presentingVC:UIViewController, animated:Bool, completion:(() -> Void)?) { 
     let navVC = UINavigationController(rootViewController: self) 
     navVC.modalPresentationStyle = .FormSheet 
     let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: Selector("dismissFormSheet")) 
     doneButton.tintColor = GlobalVars.cautionColor 
     navigationItem.setLeftBarButtonItem(doneButton, animated: false) 
     presentingVC.presentViewController(navVC, animated: true, completion: completion) 
    } 

    /// Dismisses this ViewController with animation from a modal state. 
    func dismissFormSheet() { 
     dismissViewControllerAnimated(true, completion: nil) 
    } 

} 

Когда ВК представлен в «плавающем» formsheet образом (не-полноэкранном режиме модального) она должна вести себя по существу, как показано ниже:

enter image description here

Кроме того, расположение должно быть дополнительно манипулировать, если приложение находится в любом экране 1/3 разделения (но не 2/3-х), либо на iPhone в целом. Часть iPhone достаточно проста, чтобы выяснить, в основном проверить тип устройства и соответственно отреагировать на код.

Есть ли знать, что на iPad, а) в режиме разделения экрана и b) использовать 1/3, 1/2 или 2/3?

ответ

0

Успех! Подклассифицируя UIViewController, я смог создать некоторые методы для программной настройки модальности .FormSheet, чтобы реагировать на изменения свойств presentingVC.

UIViewController Подкласс:

class MyViewControllerSubclass: UIViewController { 
private func deviceOrientation() -> UIDeviceOrientation { 
     return UIDevice.currentDevice().orientation 
    } 

    private func getScreenSize() -> (description:String, size:CGRect) { 
     let size = UIScreen.mainScreen().bounds 
     let str = "SCREEN SIZE:\nwidth: \(size.width)\nheight: \(size.height)" 
     return (str, size) 
    } 

    private func getApplicationSize() -> (description:String, size:CGRect) { 
     let size = UIApplication.sharedApplication().windows[0].bounds 
     let str = "\n\nAPPLICATION SIZE:\nwidth: \(size.width)\nheight: \(size.height)" 
     return (str, size) 
    } 

    /// Called when the UIViewController's traitCollection has changed. 
    /// - Description: 
    /// Include any changes that need to be made when the trait collection changes. 
    func respondToSizeChange (layoutStyle:LayoutStyle) { 

    } 


    enum LayoutStyle: String { 
     case iPadFullscreen   = "iPad Full Screen" 
     case iPadHalfScreen   = "iPad 1/2 Screen" 
     case iPadTwoThirdScreen  = "iPad 2/3 Screen" 
     case iPadOneThirdScreen  = "iPad 1/3 Screen" 
     case iPhoneFullScreen  = "iPhone" 
    } 

    /// - Returns: a `LayoutStyle` value containing information about what portion of the screen the application is consuming. 
    internal func determineLayout() -> LayoutStyle { 
     if UIDevice.currentDevice().userInterfaceIdiom == .Phone { 
      return .iPhoneFullScreen 
     } 
     let screenSize = getScreenSize().size 
     let appSize = getApplicationSize().size 
     //let orientation = deviceOrientation() 
     let screenWidth = screenSize.width 
     let appWidth = appSize.width 
     if screenSize == appSize { 
      return .iPadFullscreen 
     } 

     if deviceOrientation() == .Portrait && screenSize != appSize { 
      return .iPadOneThirdScreen 
     } 
     // In case the math isn't exact, set a range. 
     let lowRange = screenWidth - 15 
     let highRange = screenWidth + 15 

     if lowRange/2 <= appWidth && appWidth <= highRange/2 { 
      return .iPadHalfScreen 
     } else if appWidth <= highRange/3 { 
      return .iPadOneThirdScreen 
     } else { 
      return .iPadTwoThirdScreen 
     } 

    } 

    override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) { 
     super.traitCollectionDidChange(previousTraitCollection) 
     respondToSizeChange(determineLayout()) 
    } 
} 

А на ViewController, который представляет модальный:

class MainViewController:UIViewController { 

    /// The modally-presented formSheet. 
    var presentedFormSheet:MyViewControllerSubclass? 

    /// Modally presents the VC in `.FormSheet` style and sets the local `presentedFormSheet` variable to the VC. 
    func showContentRequirementVC() { 
     let vc = MyViewControllerSubclass(nibName: "myCustomViewController", bundle: nil) 
     vc.modalPresentationStyle = .FormSheet 
     presentedFormSheet = vc 
     presentViewController(vc, animated: true, completion: nil) 
    } 

    // When the trait collection changes, tell the presentedFormSheet about it. 
    override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) { 
     presentedFormSheet?.respondToSizeChange(determineLayout()) 
    } 
} 

Результаты: Как показано на скриншотах ниже, твердый красный bar теперь присутствует только тогда, когда листок использует всю область приложения. В переданных данных достаточно информации, которую вы можете ответить на полные, 2/3, 1/2 и 1/3 отдельно. Модаль также будет реагировать на изменения даже после того, как он будет представлен.

Также показано, что приведенные ниже снимки экрана являются причиной того, что этот вопрос имеет значение. Как вы можете видеть, бок о бок столы отлично работают, пока мы не доберемся до 1/3 или iPhone. В этот момент они должны быть либо на контроллере табуляции, либо использовать какой-либо другой метод, чтобы одновременно показывать только одну таблицу, и пользователь может переключаться между ними. Этот конкретный VC построен с помощью UIStackViews, поэтому его можно легко программно настроить в соответствии с макетом пользовательского интерфейса.

Полноэкранный full-screen

** 2/3 экрана ** 2/3 screen

1/2 экрана 1/2 screen

1/3 экрана 1/3 screen

Slide-Over slide-over