Col*_*inE 45 objective-c uisplitviewcontroller swift ios8
我有一个iOS7应用程序,它基于Xcode主 - 详细信息模板,我移植到iOS8.一个变化很大的领域是UISplitViewController
.
在纵向模式下,如果用户点击详细视图控制器,则主视图控制器将被关闭:
如果用户点击一行,我还希望能够以编程方式隐藏主视图控制器.
在iOS 7中,主视图控制器显示为弹出窗口,可以隐藏如下:
[self.masterPopoverController dismissPopoverAnimated:YES];
Run Code Online (Sandbox Code Playgroud)
使用iOS 8,主服务器不再是popover,因此上述技术不起作用.
我试图解雇主视图控制器:
self.dismissViewControllerAnimated(true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
或者告诉拆分视图控制器显示详细信息视图控制器:
self.splitViewController?.showDetailViewController(bookViewController!, sender: self)
Run Code Online (Sandbox Code Playgroud)
但到目前为止还没有任何工作.有任何想法吗?
pha*_*ann 62
按如下方式扩展UISplitViewController:
extension UISplitViewController {
func toggleMasterView() {
let barButtonItem = self.displayModeButtonItem()
UIApplication.sharedApplication().sendAction(barButtonItem.action, to: barButtonItem.target, from: nil, forEvent: nil)
}
}
Run Code Online (Sandbox Code Playgroud)
在didSelectRowAtIndexPath
或中prepareForSegue
,执行以下操作:
self.splitViewController?.toggleMasterView()
Run Code Online (Sandbox Code Playgroud)
这将使主视图平滑地滑动.
我从这篇文章中得到了使用displayModeButtonItem()的想法,我正在模拟按照这篇文章点击它.
我对这个解决方案并不满意,因为它看起来像是一个黑客.但它运作良好,似乎没有其他选择.
Vin*_*ain 11
使用preferredDisplayMode
.在didSelectRowAtIndexPath
或prepareForSegue
:
self.splitViewController?.preferredDisplayMode = .PrimaryHidden
self.splitViewController?.preferredDisplayMode = .Automatic
Run Code Online (Sandbox Code Playgroud)
不幸的是,主视图突然消失而不是滑离,尽管文档说明:
如果更改此属性的值会导致当前显示模式的实际更改,则拆分视图控制器会对生成的更改进行动画处理.
希望有一个更好的方法来实现这个实际动画变化.
Ima*_*tit 10
我能有期望的行为在Xcode的6.3主从应用程序(通用)项目由加入如下代码MasterViewController
的- prepareForSegue:sender:
方法:
if view.traitCollection.userInterfaceIdiom == .Pad && splitViewController?.displayMode == .PrimaryOverlay {
let animations: () -> Void = {
self.splitViewController?.preferredDisplayMode = .PrimaryHidden
}
let completion: Bool -> Void = { _ in
self.splitViewController?.preferredDisplayMode = .Automatic
}
UIView.animateWithDuration(0.3, animations: animations, completion: completion)
}
Run Code Online (Sandbox Code Playgroud)
完整的- prepareForSegue:sender:
实现应如下所示:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showDetail" {
if let indexPath = self.tableView.indexPathForSelectedRow() {
let object = objects[indexPath.row] as! NSDate
let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
controller.detailItem = object
controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
controller.navigationItem.leftItemsSupplementBackButton = true
if view.traitCollection.userInterfaceIdiom == .Pad && splitViewController?.displayMode == .PrimaryOverlay {
let animations: () -> Void = {
self.splitViewController?.preferredDisplayMode = .PrimaryHidden
}
let completion: Bool -> Void = { _ in
self.splitViewController?.preferredDisplayMode = .Automatic
}
UIView.animateWithDuration(0.3, animations: animations, completion: completion)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用traitCollection
也可能是displayMode
某些项目的替代/补充.例如,以下代码也适用于Xcode 6.3 Master-Detail Application(通用)项目:
let traits = view.traitCollection
if traits.userInterfaceIdiom == .Pad && traits.horizontalSizeClass == .Regular {
let animations: () -> Void = {
self.splitViewController?.preferredDisplayMode = .PrimaryHidden
}
let completion: Bool -> Void = { _ in
self.splitViewController?.preferredDisplayMode = .Automatic
}
UIView.animateWithDuration(0.3, animations: animations, completion: completion)
}
Run Code Online (Sandbox Code Playgroud)
下面的代码用动画隐藏主视图
UIView.animateWithDuration(0.5) { () -> Void in
self.splitViewController?.preferredDisplayMode = .PrimaryHidden
}
Run Code Online (Sandbox Code Playgroud)
只是稍微改善了此处列出的答案,以下代码对我来说正常工作,并且还可以流畅地处理动画:
extension UISplitViewController {
func toggleMasterView() {
var nextDisplayMode: UISplitViewControllerDisplayMode
switch(self.preferredDisplayMode){
case .PrimaryHidden:
nextDisplayMode = .AllVisible
default:
nextDisplayMode = .PrimaryHidden
}
UIView.animateWithDuration(0.5) { () -> Void in
self.preferredDisplayMode = nextDisplayMode
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,如上所述,您只需在View控制器中的任何位置使用扩展功能
self.splitViewController?.toggleMasterView()
Run Code Online (Sandbox Code Playgroud)
小智 5
斯威夫特 4 更新:
将其插入准备(用于segue:...
if splitViewController?.displayMode == .primaryOverlay {
let animations: () -> Void = {
self.splitViewController?.preferredDisplayMode = .primaryHidden
}
let completion: (Bool) -> Void = { _ in
self.splitViewController?.preferredDisplayMode = .automatic
}
UIView.animate(withDuration: 0.3, animations: animations, completion: completion)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19561 次 |
最近记录: |