【问题标题】:How to approach to this design - iOS如何实现这种设计 - iOS
【发布时间】:2015-03-08 15:33:51
【问题描述】:

我的应用是基于导航的 iPad 应用。

第一个屏幕是主屏幕。单击主屏幕上的按钮时,它会推送到地图屏幕。在地图屏幕上,我将面板(视图控制器)放在占据屏幕 1/4 的地图视图控制器上。

Left Panel 是一个具有 Table View 的 View Controller。单击单元格时,它应该将新的视图控制器推送到左侧面板,将地图视图控制器留在后面。

             Push
Home Screen -------- Map Screen
                  |(Added over map screen)         Push
                  |----- Left Panel (Table View) -------- Detail View

我无法使用拆分视图控制器,因为左侧面板和主屏幕中都有导航。有时我需要动画/隐藏左面板。我可以自定义左侧面板。

如何实现这个结构。使用嵌套导航控制器好还是有任何可用的库。我的应用程序同时支持纵向和横向。我正在使用 Swift。

【问题讨论】:

    标签: ios swift xcode6 uistoryboard


    【解决方案1】:

    对不起,我也不了解 Swift。但是,我认为您必须声明一个基本布局: 您将拥有一个 MainViewController,其中包含一个 LeftPanelViewController 和一个 FrontViewController。在 MainViewController nib 中,您将使用 AutoLayout 创建主布局:在屏幕左侧添加一个 UIView 并为首页添加另一个 UIView。 然后,链接网点,您将完成布局!然后你只需要添加/删除子视图到leftPanelViewFrontView

    现在,我认为正确的逻辑是MainViewControllerNavigationController,所以你必须实现LeftPanelViewControllerFrontViewController 的协议,所以Main 将知道如何以及何时添加/删除子视图。

    重要的是没有一个对象必须知道MainViewController 的存在才能保留逻辑。因此,您必须通知MainViewController 某事,使用delegation pattern 或其他作为NSNotification 的东西(请注意,它可能很重......)

    我希望它会有所帮助。再见

    【讨论】:

    • 谢谢。但我认为我必须在左侧面板视图中手动处理推送和弹出动画。
    • 我认为MainViewControllerUIView 子视图中的UINavigationController 并不好。如果你实现一个自定义方法来添加/删除带有某种动画的子视图,也许会更好。
    【解决方案2】:

    我会通过添加ContainerView 作为您的左侧面板来解决这个问题。正如您要在此处执行推送一样,您可以将容器视图控制器设为导航控制器,并将表视图作为其根视图控制器。

    您仍然可以像任何其他视图一样为容器视图设置动画/隐藏。

    【讨论】:

      【解决方案3】:

      UIViewController 的这个扩展在左侧创建侧面板。

      private var temp_view:UIView?
      private var temp_width:CGFloat?
      private weak var temp_sidebar:UIViewController?
      
       extension UIViewController {
      
      
      
      func configureSideBar(StoryBoard:String,SideBarIdentifier:String,View:UIView){
      
          var storyboard = UIStoryboard(name: StoryBoard, bundle: nil)
          weak var sidebar = storyboard.instantiateViewControllerWithIdentifier(SideBarIdentifier) as? UIViewController
          let width:CGFloat = 250//sidebar!.view.frame.size.width
          let height = UIScreen.mainScreen().bounds.height
          let frame = CGRectMake(0, 0, width, height)
      
          temp_view = View
          temp_width = width
          temp_sidebar = sidebar
      
          sidebar!.view.frame = frame
          addChildViewController(sidebar!)
          view.addSubview(sidebar!.view)
          view.sendSubviewToBack(sidebar!.view)
          toogleSideBarWithAnimation(0.2,Open:false)
      
      }
      
      
      func getSidebar() -> UIViewController?{
      
          if let sdbar = temp_sidebar {
              return sdbar
          }
          else {
             println("Warning:You have tou configure sidebar first")
              return nil
          }
      
      }
      
      
      func toogleSideBarWithAnimation(Duration:NSTimeInterval,Open:Bool) {
      
          if let view = temp_view {
              UIView.animateWithDuration(Duration, delay: 0, options: UIViewAnimationOptions.TransitionFlipFromLeft, animations: {
                  var Frame = view.frame
      
                  if !Open{
      
                      Frame.origin.x = 0
                  }
                  else {
                      Frame.origin.x = temp_width!
                  }
      
                  view.frame = Frame
                  }, completion: { finished in
      
              })
          }
          else {
              println("Warning:You have tou configure sidebar first")
      
          }
      }
      

      }

      让我解释一下如何使用它。

      首先创建一个视图控制器场景并设置故事板ID。在这个例子中,我使用了“侧边栏” 然后像这样将这条指令添加到地图视图控制器到viewDidLoad中

          override func viewDidLoad() {
          super.viewDidLoad()
          self.configureSideBar("Main", SideBarIdentifier: "sidebar", View: Subview)
      }
      

      我建议在地图视图控制器中添加一个包含所有视图的 UIView

      使用此指令打开和关闭它

      self.toogleSideBarWithAnimation(0.2,Open:OpenSidebar)
      

      【讨论】:

        猜你喜欢
        • 2017-05-10
        • 2019-01-09
        • 2020-11-30
        • 1970-01-01
        • 2021-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多