我已经看到一些iPad应用程序填满了屏幕(例如Stanza)或者已经在状态栏下方摆角(例如,iPod播放器的顶部有方角;底部无法分辨).有谁知道这是怎么做的?
看来,默认情况下,顶级UIWindow应用了剪裁区域,因为我放置在该窗口中的任何子视图都会在这些角落中被剪掉.如果是这样的话,有没有办法摆脱这个?顺便说一句,剪辑似乎只在iPad上,而不是在我的iPod Touch上(至少,不是我在那里运行的旧操作系统版本).
跟进:我甚至以编程方式创建了UIWindow,然后将其背景设置为纯色,圆角仍然存在,确认裁剪要么在UIWindow上,要么更高.
我有一个场景,我从主窗口的rootViewController呈现模态视图控制器.当它正在加载这个模态的内容时,我正在切换到另一个加载窗口,我将其设为关键且可见.
此窗口充当加载指示器,不允许用户与应用程序交互.完成加载后,我将其切换回主窗口并使其显示为可见.当我这样做时,模态是强制关闭,应用程序不再能够呈现模态.
有趣的是,如果我在切换回主窗口时执行[UIWindow makeKeyWindow],则没有问题.[UIWindow makeKeyAndVisible]是导致问题的原因.[UIWindow makeKeyWindow]是否可以接受?
这只是iOS 5.在iOS 6中没有问题.我不支持iOS 4.有谁知道这里可能会发生什么?
我知道这看起来像一个很大的问题,但并不是那么害怕阅读它.主要是我解释东西是如何工作的.
UIWindow我的应用程序中有两个s.第一个是默认情况下应用程序创建的主窗口.第二个被调用modalWindow,也在app delegate中创建.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.modalWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.modalWindow.windowLevel = UIWindowLevelStatusBar;
//Other stuff I need
//....
return YES;
}
Run Code Online (Sandbox Code Playgroud)
我的大多数应用程序只是纵向,但有一个视图控制器,用户可以切换到横向.我正在通过以下方式倾听景观变化:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
Run Code Online (Sandbox Code Playgroud)
这工作正常,并在orientationChanged方法中呈现横向视图控制器.一切都很顺利.如果我旋转回肖像,我orientationChanged再次被解雇,此时我解除了横向视图控制器.
现在让我们解释第二个窗口是如何发挥作用的.在横向模式下,有一个动作(只按一下按钮),在第二个窗口(the modalWindow)上显示一个新的视图控制器.好的,我们来解释一下.
app委托有两种方法,如下所示:
- (void)presentActivityOnModalWindow:(UIViewController *)viewController
{
self.modalWindow.rootViewController = viewController;
self.modalWindow.hidden = NO;
}
- (void)modalTransitionFinished:(NSNotification *)notif
{
self.modalWindow.hidden …Run Code Online (Sandbox Code Playgroud) 当我使用 来显示警报时UIAlertController,警报本身会显示在新窗口中。(至少现在)当警报窗口消失时,系统似乎设置了一个随机窗口键窗口。
我正在呈现一个新的“横幅”窗口,以在状态栏上呈现一些横幅(AppStore 兼容性不在此处的主题),通常,此“横幅”窗口成为下一个关键窗口,并导致用户输入和第一响应者出现许多问题管理。
所以,我想防止这个“横幅”窗口成为关键窗口,但我不知道如何做。目前,作为一种解决方法,我只是在“横幅”窗口成为关键窗口后立即将主窗口重新设置为关键窗口。但感觉其实不太好。
如何防止某个窗口成为关键窗口?
我正在尝试在将动作发送到MyController类时更改UIWindow的背景颜色.但是UIWindow驻留在AppDelegate类中,因此我无权访问该变量来使用它来修改它
window.backgroundColor = [UIColor theColor];
Run Code Online (Sandbox Code Playgroud)
在MyController中.这是MyController.m的代码:
@implementation MyController
- (IBAction)sliderChanged:(id)sender {
//want to call some method to change the UIWindow background color
}
@end
这是AppDelegate.h的代码:
@interface AppDelegate : NSObject {
UIWindow *window;
}
- (void)changeColorToRed:(int)r Green:(int)g Blue:(int)b;
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end
我试图在AppDelegate类中实现一个方法changeColorToRed ...因为该方法可以访问该变量window,但我无法从sliderChangedMyController中的方法调用它.
如何从其他类修改UIWindow*窗口?
我已经能够在所有其他视图(包括键盘)上方放置半透明视图,以使用以下代码对屏幕进行着色:
int count = [[[UIApplication sharedApplication]windows]count];
[[[UIApplication sharedApplication] windows] objectAtIndex:count-1]addSubview:tintView];
Run Code Online (Sandbox Code Playgroud)
现在我遇到了一个问题.我的应用程序使用MessageUI.framework来显示MFMessageComposeViewController,它允许用户发送文本消息.这是我遇到问题的地方.
当我在这种情况下执行上面的代码时(显示消息视图时),它可以正常工作.问题是,用户无法再与其下方的消息视图进行交互.我一直在我的tintView上将userinteractionenabled设置为NO,但在这种情况下它没有帮助解决问题.
但是,将隐藏的色调视图设置为YES确实允许交互.通过更改此属性可以使消息视图与之交互.显然,我希望tintView可见.
我在最顶层的UIWindow中查看了视图,发现UIRemoteView(我找不到任何信息,但似乎是在MessageUI.framework中显示的视图)是当tintView在它上面时没有接收到触摸的视图.
即使在其上显示另一个UIView,我如何允许与MFMessageComposeViewController进行交互.Userinteractionenabled在这种情况下不起作用,但将视图设置为隐藏(这不是我想要的).
我正在开发一个应用程序,它需要显示覆盖范围以及其他所有内容.它通过创建一个新的UIWindow,并使用makeKeyAndVisble"接管"屏幕来实现这一点.完成后,它会将控制权返回给原始UIWindow.
这是一件坏事吗?感觉它正在控制应用程序的低水平,这通常很糟糕; 另一方面,它非常简单,所以也许完全可以接受.
意见/经验?
我的要求是UITabBarController是rootviewcontroller,并且在第一次启动应用程序时,我想要显示UINavCon内部的登录过程,我正在显示它presentViewController.
我不希望第一次看到UITabBarController并且不想如何登录UINavCon作为模态弹出.
我想让用户体验如果应用程序第一次启动登录UINavCon应该是可见的.所以这是我的代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window makeKeyAndVisible];//is it correct to call it here?
LoginVC *loginObj = [[LoginVC alloc]init];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:cellPhoneNumber];
self.tabBarController = [[UITabBarController alloc]init];
self.window.rootViewController = self.tabBarController;
[self.tabBarController presentViewController:self.navigationController animated:NO completion:^{}];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
我正在呼叫[self.window makeKeyAndVisible];第二行uiwindow alloc init.这样做是否正确,或者我可能遇到像viewcontroller没有接收事件或方向通知的问题?
我创建了一个iOS 7密码副本,我有这个问题,我似乎无法解决.我需要将锁定屏幕视图放在其他所有内容之上,因此应用程序在iOS的多任务视图中有所涉及,因此我将其直接添加到keyWindow.到目前为止一切都很好.
当我必须显示锁定屏幕时,如果有一个alertView或actionSheet(alertView在这篇文章中只提及s,为了保持简单),就会出现问题.已经多次回答过alertView,iOS 7 中没有对s的引用,这是真的,它们显示的窗口是_UIModalItemHostingWindow2 UIView秒,实际上没有引用alertView.
这_UIModalItemHostingWindow 也成为新的keyWindow,所以它在其他一切之上,但[UIApplication sharedApplication].windows如果我将锁定屏幕添加到我的前者keyWindow(默认情况下keyWindow,如果你愿意的话),它就无法在意义中找到,它将位于alertView其暗淡的背景之下,所以用户在解雇之前不能与锁屏交互alertView.另一个选项在下面进一步详述.
锁定屏幕的工作方式如下:在applicationDidEnterBackground其上检查是否启用了密码; 如果它已启用并且密码持续时间为0(用户选择立即锁定应用程序),它会立即添加锁定屏幕,因此它会覆盖多任务视图中的应用程序.现在,我上面提到的选项是添加alertView到这个_UIModalItemHostingWindow窗口,但是当返回到应用程序时,锁定屏幕视图显示延迟1秒(即使我在进入后台之前添加了它!)和应用程序多任务处理视图中没有任何内容.(目前它也显示在错误的位置,如果你继续下载它,那是固定的,但我还没有推动提交).
我试图隐藏removeFromSuperview这个_UIModalItemHostingWindow,但是当回到应用程序时,alertView动画仍然像刚刚被解雇一样运行.我怀疑上面提到的延迟也是由于Apple alertViews回到前台时的处理方式.
我也尝试创建一个新窗口并使其成为新的keyWindow,但同样的事情发生.
这是一个关于这个的小讨论,涵盖了我尝试的所有内容,也许我在这篇文章中遗漏了一些东西. https://github.com/rolandleth/LTHPasscodeViewController/issues/16
有任何想法吗?除了创建的每一个手动引用alertView和actionSheet我的应用程序里面,因为我试图找到密码库,而不是我自己的应用程序修复; 我可以找到脏的解决方法,没问题:)
更新:窗口_UIAlertOverlayWindow是否actionSheet使用而不是a alertView,但就我所知,它的行为相同.
我正在尝试“镜像”视图控制器:
我已经MkMapViews通过处理诸如区域更改或在vc1中滚动并告诉vc2设置其区域或滚动到该位置之类的东西来进行诸如简单视图控制器之类的工作,在vc1上使用UIControl IBActions也在其中调用了相同的动作vc2等
这适用于简单的情况,但是问题来自于复杂的视图控制器,这些视图控制器具有诸如UITableViews自定义UITableViewCells,扩展/收缩之类的东西。我发现自己必须实现每个可能的委托/动作,并使一堆对象意识到他们不应该做的事情不知道,如果我要使其完全可重用,这似乎是错误的。
我尝试过遍历vc1的子视图树,并objc_setAssociatedObject()用于将视图控制器实例中的UIResponders相互关联,但是我仍然必须捕获vc1上的每个委托/动作以在vc2上查找UIResponder模仿事件。必须有一种更简单的方法来执行此操作。我也尝试了子类化UIWindow和重写sendEvent,并将事件发送到外部显示器UIWindow,但是每个事件UIEvent似乎都包含将其与UIWindow原始显示器相关联的信息UIWindow,因为当我发送事件时,外部显示器没有执行任何操作。
我将如何以一种允许我将镜像抽象成一个不错的子类或某种东西的方式来做到这一点,而不必用特殊情况的代码乱扔每个视图控制器?我曾经考虑过让UIView的触摸事件陷入混乱,但是我什至不确定这是否会有所帮助,因为UITouches和UIEvents已与它们源自的UIWindow绑定在一起,而UIEvent似乎并没有为我提供创建自己的方法事件。
注意:我要执行的操作不是默认的Airplay镜像,因为我希望外部显示体验能够充分利用完整的显示分辨率和尺寸。想法是允许iPhone应用程序在设备本身上运行(即比其宽),同时在适合该显示器的外部显示器上提供体验(比其高,更大的分辨率,更大的机会)。以更具可读性的高清电视格式显示信息)。
有什么想法吗?