如何实现此设计-iOS
我的应用程序是基于导航的iPad应用程序 第一个屏幕是主屏幕。单击主屏幕上的按钮,它将进入地图屏幕。在地图屏幕上,我在地图视图控制器上方有一个左面板(视图控制器),它占据了屏幕的1/4 左面板是一个具有表视图的视图控制器。单击单元格时,它应将新的viewcontroller推到左侧面板,将地图视图控制器留在后面如何实现此设计-iOS,ios,swift,xcode6,uistoryboard,Ios,Swift,Xcode6,Uistoryboard,我的应用程序是基于导航的iPad应用程序 第一个屏幕是主屏幕。单击主屏幕上的按钮,它将进入地图屏幕。在地图屏幕上,我在地图视图控制器上方有一个左面板(视图控制器),它占据了屏幕的1/4 左面板是一个具有表视图的视图控制器。单击单元格时,它应将新的viewcontroller推到左侧面板,将地图视图控制器留在后面 Push Home Screen -------- Map Screen |(Added over map screen)
Push
Home Screen -------- Map Screen
|(Added over map screen) Push
|----- Left Panel (Table View) -------- Detail View
我不能使用分割视图控制器,因为在左面板和主屏幕中都有导航。有时我需要设置左面板的动画/隐藏左面板。我可以定制左面板
如何实现这个结构。是否可以使用嵌套导航控制器,或者是否有可用的库。我的应用程序支持纵向和横向。我用的是Swift。对不起,我也不认识Swift。但是,我认为您必须声明一个基本布局: 您将拥有一个MainViewController,其中包括一个
LeftPanelViewController
和一个FrontViewController
。在MainViewController nib中,您将使用AutoLayout
:在屏幕左侧添加一个UIView,并为frontpage添加另一个UIView来创建主布局。
然后,链接插座,您将完成布局!然后只需将子视图添加/删除到leftPanelView
和FrontView
现在,我认为正确的逻辑是,MainViewController
是NavigationController
,因此您必须实现LeftPanelViewController
和FrontViewController
的协议,这样Main将知道如何以及何时添加/删除子视图
重要的是,任何对象都不必知道MainViewController
的存在才能保留逻辑。因此,您必须通知MainViewController
,以便使用委派模式
或其他类似于NSNotification
(请注意,它可能非常重要……)
我希望这会有帮助。再见此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)
我可以通过添加一个
ContainerView
作为左侧面板来解决这个问题。在这里进行推送时,可以将容器视图控制器设置为导航控制器,并将表视图作为其根视图控制器
您仍然可以像其他视图一样设置/隐藏容器视图的动画。谢谢。但我认为我必须在左面板视图中手动处理推送和弹出动画。我认为
MainViewController
的UIView
子视图中的UINavigationController
不好。如果您实现一个自定义方法来添加/删除带有某种动画的子视图,可能会更好。