菜鸟教程小白 发表于 2022-12-12 23:47:08

iOS:创建另一个 UIWindow 作为覆盖的问题(iOS 7 问题?)


                                            <p><p>我想在所有其他 View (包括键盘)之上创建一个覆盖 View ,并且创建另一个 UIWindow 似乎是执行此操作的方法。看完<a href="https://developer.apple.com/library/ios/documentation/windowsviews/conceptual/viewpg_iphoneos/CreatingWindows/CreatingWindows.html#//apple_ref/doc/uid/TP40009503-CH4-SW1" rel="noreferrer noopener nofollow">the Windows section of the View Programming Guide</a>还有一些网上的其他文件,看来我只需要……</p>

<ul>
<li>使用屏幕边界创建窗口,</li>
<li>将其<code>windowLevel</code>设置为<code>UIWindowLevelStatusBar</code>,</li>
<li>将 <code>userInteractionEnabled</code> 设置为 <code>NO</code>(因此它会忽略触摸),</li>
<li>并通过将其 <code>hidden</code> 属性设置为 <code>NO</code> 使其可见(不使其成为关键窗口,因此它不会接收非触摸事件)。</li >
</ul>

<p>这是我的应用委托(delegate)中的代码:</p>

<pre><code>self.overlayWindow = [ initWithFrame:.bounds];
self.overlayWindow.backgroundColor = ;
self.overlayWindow.windowLevel = UIWindowLevelStatusBar;
self.overlayWindow.userInteractionEnabled = NO;
self.overlayWindow.rootViewController = [ initWithNibName:nil bundle:nil];
self.overlayWindow.hidden = NO;
</code></pre>

<p>但是,我遇到了一些问题:</p>

<ol>
<li><code></code> 正在设置状态栏文本颜色,而我实际上希望原始窗口的 Root ViewController 执行此操作。</li>
<li>一个大问题是,额外的窗口以某种方式扰乱了我对软件键盘通知的处理。似乎我仍然收到通知,但在某些情况下我的应用程序响应异常。 (我不会解释这些奇怪的行为是什么,因为它们跑题了。)关键是我根本不应该得到这些奇怪的行为:我只是想在应用程序上绘制一个覆盖层,而应用的行为应该和以前一样。</li>
<li>我希望 <code>overlayWindow</code> 的旋转与我的原始窗口的旋转相匹配,但它是独立旋转的。例如,UINavigationController 的 swipe-to-go-back 手势锁定了界面方向,但 <code>overlayWindow</code> 在此期间仍然可以旋转。</li>
</ol>

<p>我应该怎么做才能解决这个问题,这样我才能在应用程序上得到一个无害的覆盖?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我已经完成了与使用窗口非常相似的事情。在我的情况下,我没有使用附加到窗口的 UIViewController,只是需要的 subview ,所以它看起来是正确的。为了正确处理旋转,您可以收听 NSNotification </p>

<pre><code>UIApplicationDidChangeStatusBarOrientationNotification
</code></pre>

<p>在方法处理程序中,您可以像调用这样的调用一样获取设备方向</p>

<pre><code>UIInterfaceOrientation orientation = [ statusBarOrientation];
</code></pre>

<p>然后您可以使用 CGAffineTransformMakeRotation 将窗口内的 View 旋转到正确的方向。从该方法的外观来看,您会认为您会在设备方向动画后收到通知,但是您会在之前收到通知,当您使用变换旋转 View 时,您的旋转将与其他所有内容一起动画(这是假设事情是居中的,如果没有事情更复杂)。如果您想要一个示例 <a href="https://github.com/samvermette/SVProgressHUD" rel="noreferrer noopener nofollow">https://github.com/samvermette/SVProgressHUD</a>,SVProgress hud 将是一个很好的学习示例</p></p>
                                   
                                                <p style="font-size: 20px;">关于iOS:创建另一个 UIWindow 作为覆盖的问题(iOS 7 问题?),我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/24689847/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/24689847/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iOS:创建另一个 UIWindow 作为覆盖的问题(iOS 7 问题?)