我有一个返回一个UIViewController YES中shouldAutorotateToInterfaceOrientation:为UIDeviceOrientationPortrait和NO其他一切.在堆栈顶部的那个视图中,我pushViewController:animated:用来推动一个新的UIViewController.新控制器返回YES任何内容shouldAutorotateToInterfaceOrientation:.
第一个视图拒绝旋转(如预期的那样).按下第二个视图后,用户可以旋转设备,UI将旋转(也如预期).如果第二个视图处于横向模式并且用户按下后退按钮(调用popViewControllerAnimated:),则第一个视图将显示为旋转(意外!).
如果用户将设备旋转回纵向,则视图将旋转,然后像以前一样卡在纵向模式中.这可行,但对于用户来说,它们会旋转回来之前很难看.所以我正在寻找一种让这种观点保持纵向模式的方法.
到目前为止我找到的唯一解决方法是使用-[UIDevice setOrientation:],它会抛出一个警告(orientation只读),但是因为实际定义了它.这是一个巨大的黑客,我想要一个真正的解决方案.为了寻找真正的解决方案,我将GDB附加到了Photos应用程序(MobileSlideshow.app)并发现它也使用了-[UIDevice setOrientation:].作为一个内部应用程序虽然我猜他们有不同的规则.
有没有正确的方法来实现预期的自转行为?
我正在研究基于导航控制器的iPhone应用程序.例如,这里有2个视图.
A(UITableViewController)和B(ViewController)
这个任务就在这里.当用户在视图A中选择一个项目时,应用程序将强制导航控制器在推送视图B之前隐藏导航栏,如下面的语句:
self.navigationController.navigationBarHidden = YES;
[self.navigationController pushViewController:controllerB animated:TRUE];
Run Code Online (Sandbox Code Playgroud)
也就是说,View B就在那里.但是如何在没有导航栏的情况下导航回View A?在这种情况下,我们将使用"返回"按钮让用户点击它以导航回View A.你能帮助我吗?
是什么beetween调用差异presentModalViewController和pushViewController,当:
这只是为了能够从第一个推出的视图回来吗?Woooaaaaaa .....
我想差异在于其他地方和更深层次.不是吗?
cocoa-touch uinavigationcontroller pushviewcontroller presentmodalviewcontroller ios
只是好奇,为什么设置self.navigationItem = ...工作,但self.navigationController.navigationItem失败了?这同样适用于self.toolbarItemsVS self.navigationController.toobarItems.
什么时候用self.navigationController.navigationItem?
也许你会说,他们指的是不同的东西.但为什么self.navigationController.navigationBarHidden = YES隐藏导航栏.这不是指self.navigationController.navigationItem我想要的酒吧吗?
viewControllers
视图控制器当前位于导航堆栈上.
Run Code Online (Sandbox Code Playgroud)@property(nonatomic, copy) NSArray * viewControllers讨论
根视图控制器位于数组中的索引0处,后视图控制器位于索引n-2处,顶部控制器位于索引n-1处,其中n是数组中的项目数.
为此属性分配新的视图控制器数组等效于调用setViewControllers:animated:方法,并将动画参数设置为NO.
我很困惑如何访问堆栈我在导航控制器中有三个视图 - 根视图控制器,sti测试位置,sti地图.
我怎样才能访问堆栈?
我正在使用自定义drawRect函数UINavigationBar在iOS4中跨我的应用程序进行绘制,它不使用图像,只使用CoreGraphics.
由于您无法UINavigationBar在iOS5中实现类别中的drawRect ,因此Apple建议使用子类UINavigationBar.
当属性是只读时,如何替换UINavigationBarmy子类UINavigationController(因此它将与iOS4和iOS5兼容)navigationBar?
@property(nonatomic, readonly) UINavigationBar *navigationBar
Run Code Online (Sandbox Code Playgroud)
我根本不在我的应用程序中使用XIB,因此添加UINavigationBar到NIB并通过InterfaceBuilder更改类不是一种选择.
iphone cocoa-touch uinavigationbar uinavigationcontroller ios
我想在当前视图上以模态方式呈现具有略微透明背景的视图控制器,这样第一个视图在模态视图下稍微可见.
我设置模态视图控制器的alpha值并设置modalPresentationStyle为UIModalPresentationCurrentContext,如另一篇文章中所建议的那样.
结果是视图背景在动画制作时是透明的,但是当视图控制器就位时,它会变为不透明的黑色.它可以恢复透明,同时激活解雇.
如何在活动时让它变得透明?
我已经测试过了iOS 6 and 7.我使用的代码如下:
MyModalViewController *viewController = [[MyModalViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
[navController setNavigationBarHidden:YES];
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self.navigationController presentViewController:navController animated:YES completion:NULL];
Run Code Online (Sandbox Code Playgroud) uiviewcontroller uinavigationcontroller modalviewcontroller ios
是否有一个干净的解决方案来获取视图控制器上的回调或事件被一个interactivePopGestureRecognizer?解除(弹出)?
为了清楚起见,我需要在最先控制器(而不是其他控制器)上调用一些显式方法,然后才能通过此手势识别器弹出控制器.我不想在导航控制器上获取事件并将事件发送到适当的控制器,我不想使用viewWillAppear或viewWillDissapear...
我最接近的是为只有2个问题的手势添加目标/选择器对.首先,如果控制器被解雇,我将无法获得直接信息(UIGestureRecognizerStateEnded无论如何都会被解雇).在控制器被解雇后的第二个我需要从识别器中删除目标.
原因是我有一些控制器需要向他们的代表发送一些信息.通过"完成"和"取消"按钮触发事件,调用委托方法,然后弹出控制器.尽管对代码的更改尽可能少,但我需要几乎相同.
这种姿势的另一种情况是抛出警报视图并恢复动作的可能性:当这个姿势结束时,是否有一种显示警报视图的方式,例如"你确定要取消你的工作"并让用户选择是否控制器将被弹出或带回来.
我想将标题的字体改为Avenir,我想把它变成白色.这是我在viewDidLoad方法中的代码:
UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName: UIFont(name: "Avenir", size: 20)!]
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
Run Code Online (Sandbox Code Playgroud)
此代码仅更改标题的颜色,而不是字体.另外,我尝试在App Delegate File中实现它,但这不起作用.
我希望标题也有Avenir的字体.我该如何实现这一目标?
我的导航控制器间歇性地在推动时冻结.它似乎将新的视图控制器添加到堆栈中,但动画永远不会发生.我还有两个其他容器在屏幕上保存视图控制器,我可以在导航控制器冻结后很好地与它们进行交互.真正有趣的是,如果我尝试将另一个视图控制器推到导航控制器的堆栈上,我注意到堆栈顶部有一个额外的视图控制器(我最初推动的视图控制器冻结了导航控制器).所以,如果我在主屏幕上(我们将其称为VC-Home)并尝试推送新视图(VC-1)并冻结,那么我尝试推送新视图(VC-2),这是我在推送之前在当前堆栈中看到的内容:
{ [VC-Home, VC-1] }
并且在调用pushViewController之后,它保持不变; VC-2未添加到堆栈中.
据我所知,导航控制器通过在动画开始之前使前一个视图控制器处于非活动状态来启动动画,但随后动画永远不会发生,导航控制器处于冻结状态.
我正在通过调用从故事板创建新的视图控制器,
UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController")所以我认为那里没有任何问题.我也没有在导航栏上覆盖pushViewController.关于我的应用程序的一些独特的东西是,它是非常高解析度图像重(使用SDWebImage来管理),我总是在屏幕上有三个容器在一次(一个导航控制器,用于搜索一个视图控制器,以及一个互动排水沟/侧面/滑出菜单).
CPU使用率低且内存使用率正常(发生冻结时设备稳定在60-70MB左右).
是否有任何想法可能导致这个或任何调试技巧可以帮助我发现真正的问题?
更新
UINavigationController没有唯一的代码,因为我只是推动使用pushViewController().这是调用它的代码:
func didSelectItem(profile: SimpleProfile) {
let vc = UIStoryboard.profileViewController()
vc.profile = profile
navigationController?.pushViewController(vc, animated: true)
}
Run Code Online (Sandbox Code Playgroud)
我推送的ViewController在viewDidLoad中有以下代码:
override func viewDidLoad() {
super.viewDidLoad()
button.roundView()
if let type = profile?.profileType {
//load multiple view controllers into a view pager based on type
let viewControllers = ProfileTypeTabAdapter.produceViewControllersBasedOnType(type)
loadViewPagerViews(viewControllers)
let topInset = headerView.bounds.height + tabScrollView.contentSize.height
if let viewPager = viewPager {
for view in viewPager.views {
if …Run Code Online (Sandbox Code Playgroud) ios ×8
iphone ×4
cocoa-touch ×3
objective-c ×2
swift ×2
fonts ×1
ios7 ×1
rotation ×1
sdwebimage ×1