UINavigationController Bar后面的UIViewController - 正确的方法

时间:2015-10-10 15:42:19

标签: swift uiviewcontroller uinavigationcontroller

我在代码中使用我的UI,我遇到了问题,我的UIViewController在我的UINavigationController栏后面徘徊。

我用Google搜索了一下,似乎有三种解决方案。然而,一切都是指从iOS 6到iOS 7的过渡,这看起来有点像黑客。我无法想象这仍然是必须要做的事情。

解决方案正在消除半透明,这是我不想做的。在某个时间点,我可能希望滚动内容,然后在导航栏的背景中显示模糊。另一个解决方案是通过添加" fake"填充。这也不理想,因为我不知道我的内容是否有一天会超出屏幕,然后如前所述,我希望将内容放在导航栏后面。然后是最后一个解决方案self.edgesForExtendedLayout = UIRectEdge.None,看起来非常像黑客。

也许是因为我启动UIViewController的方式,所以我在这里添加我在AppDelegate中使用的代码:

var window: UIWindow?
var navigationController: UINavigationController?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

     window = UIWindow()

     if let window = window {
         window.backgroundColor = UIColor.whiteColor()

         let vc = CustomUIViewController()
         navigationController = UINavigationController(rootViewController:vc)

         if let _ = navigationController {
             window.rootViewController = navigationController
         }
         window.makeKeyAndVisible()
     }
     return true
}

目前我正在使用self.edgesForExtendedLayout = UIRectEdge.None viewDidLoad()处理private static SHDocVw.InternetExplorer browser; private static SHDocVw.ShellWindows shellWindows; private static ArrayList Current_IE_Handles; static void Main(string[] args) { Current_IE_Handles=new ArrayList(); shellWindows = new SHDocVw.ShellWindowsClass(); shellWindows.WindowRegistered+=new SHDocVw.DShellWindowsEvents_WindowRegisteredEventHandler(shellWindows_WindowRegistered); shellWindows.WindowRevoked+=new SHDocVw.DShellWindowsEvents_WindowRevokedEventHandler(shellWindows_WindowRevoked); } // THIS EVENT IS FIRED WHEN THE BROWSER IS JUST ABOUT THE NAVIGATE TO A WEBSITE private static void browser_BeforeNavigate2(object a,ref object b,ref object c,ref object d,ref object e,ref object f,ref bool g) { try { bool adbar = (bool)a.GetType().InvokeMember("AddressBar", System.Reflection.BindingFlags.GetProperty, null, a, null); if (adbar) Console.WriteLine(b); } catch (Exception) { } } // THIS EVENT IS FIRED WHEN A BROWSER IS CLOSED private static void shellWindows_WindowRevoked(int z) { string filnam; ArrayList Closed_IE=new ArrayList(); foreach (SHDocVw.InternetExplorer ie in shellWindows) { filnam = Path.GetFileNameWithoutExtension(ie.FullName).ToLower(); if (filnam.Equals("iexplore")) Closed_IE.Add(ie.HWND); } foreach (int hwnd in Current_IE_Handles) { if (!Closed_IE.Contains(hwnd)) { Console.WriteLine("Browser Closed : Handle( " + hwnd.ToString("X4") + " )"); Current_IE_Handles.Remove(hwnd); break; } } } // THIS EVENT IS FIRED WHEN A NEW BROWSER IS OPENED private static void shellWindows_WindowRegistered(int z) { string filnam; foreach (SHDocVw.InternetExplorer ie in shellWindows) { filnam = Path.GetFileNameWithoutExtension(ie.FullName).ToLower(); if (filnam.Equals("iexplore")) { if (!Current_IE_Handles.Contains(ie.HWND)) { Current_IE_Handles.Add(ie.HWND); Console.WriteLine("Browser Open : Handle( " + ie.HWND.ToString("X4") + " )"); //ie.BeforeNavigate2 += new SHDocVw.DWebBrowserEvents2_BeforeNavigate2EventHandler(browser_BeforeNavigate2); ie.NavigateComplete2 += browser_NavigateComplete2; } } } } static void browser_NavigateComplete2(object pDisp, ref object URL) { try { bool adbar = (bool)pDisp.GetType().InvokeMember("AddressBar", System.Reflection.BindingFlags.GetProperty, null, pDisp, null); if (adbar) Console.WriteLine(URL); } catch (Exception) { } } ,但感觉不对。

感谢有关如何正确处理此问题的任何建议。

1 个答案:

答案 0 :(得分:0)

将扩展边设置为None没有任何错误 - 这就是 的设置。

如果您的内容实际上是静态的,另一个非常好的方法是使用自动布局并将视图控制器主视图的子视图的顶部固定到视图控制器的顶部布局指南。顶部布局指南的底部自动定位,以便在存在时与导航栏的底部相匹配。这就是“现代方式”。它具有以下优点:当导航栏消失时(即在横向上)它继续工作。

如果您的内容是滚动视图,则设置内容插图,以便即使滚动视图本身向上延伸到导航栏后面,其内容的顶部滚动视图一直滚动到顶部时完全可见。默认情况下,运行时会自动为您执行此操作。