模糊包含键盘及其下方内容的 UIView (iOS 7)

Posted

技术标签:

【中文标题】模糊包含键盘及其下方内容的 UIView (iOS 7)【英文标题】:Blurring a UIView that contains the keyboard with content beneath it (iOS 7) 【发布时间】:2013-10-27 08:25:55 【问题描述】:

我有一个 UIView 和一个 UITableView 在键盘下方延伸。表格视图中的内容足够亮,清楚地表明内容位于键盘后面。我正在尝试截取整个视图的屏幕截图,以便使用以下代码对其进行模糊处理:

- (UIImage *)screenshotFromView:(UIView *)view;

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0);
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;

但是,返回的图像不会创建透明键盘。当从非模糊视图转到模糊视图时,这会出现奇怪的过渡,因为在过渡到模糊图像之前,键盘后面有明显的内容。

是否可以在不使用私有API的情况下截取整个屏幕,同时仍然保持键盘+状态栏的透明度?

【问题讨论】:

您能否澄清一下,您想截取屏幕截图(包括键盘)以使其模糊?是否在关闭应用程序之前显示它以模糊重要信息,使其在多任务面板中不可见? 【参考方案1】:

这些天我遇到了和你一样的问题,所以我很清楚你想要什么。我希望整个 UI 模糊在一条消息后面,包括键盘,这不包含在任何常规的屏幕截图方法中。我的治疗方法是以下代码:

- (UIImage*)screenShotWithKeyboard:(UIView *)viewToShoot

    UIWindow *keyboard = nil;
    for (UIWindow *window in [[UIApplication sharedApplication] windows])
    
        if ([[window description] hasPrefix:@"<UITextEffectsWin"])
        
            keyboard = window;
            break;
        
    

    // Define the dimensions of the screenshot you want to take (the entire screen in this case)
    CGSize size =  [[UIScreen mainScreen] bounds].size;

    // Create the screenshot
    UIGraphicsBeginImageContext(size);

    CGContextRef context=UIGraphicsGetCurrentContext();

    // delete following line if you only want the keyboard
    [[viewToShoot layer] renderInContext:context];

    if(keyboard!=nil)
        [[keyboard layer] renderInContext:context];

    UIImage *screenImg = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return screenImg;

我从Aran Balkan 的一篇文章中得到了这个想法,我将它分解为一种方法,并为 ios 7 测试它,这似乎对我有用。这篇文章值得一读,因为他稍微解释了背后的技巧。由于您只想要实际的键盘作为图像,您可以注释掉我在代码中标记的行。使用该图像键盘,您可以自己进行模糊处理。 代码远非完美,但我想你明白了。

最后有两个想法: 我是目标 c 和 iOS 开发的大一新生。如果您发现任何有问题的错误,非常欢迎发表评论以改进此答案。 其次,我今天在我的应用程序中编写了这段代码,我还不知道我是否违反了任何 iOS 开发者规则。目前我没有看到任何问题,但我会进一步调查,因为我想用那个图形技巧发布我的应用程序。我会不断更新这篇文章。在此之前,与第一点一样,我非常感谢您对此问题的任何评论。

【讨论】:

感谢您的评论马丁!虽然上面的代码捕获了键盘,但不幸的是它没有捕获键盘的透明度。因此,如果内容后面有任何类型的彩色内容,模糊过渡将继续看起来很尴尬——因为它看起来好像彩色内容在模糊过程中被移除了。 @bdev 是的,看起来我很乐意提供帮助,以至于我不了解您的真正问题。对此感到抱歉。【参考方案2】:

您是否考虑过使用UIKeyboardAppearanceDark?目前keyboardAppearance 的默认值对应UIKeyboardAppearanceLight,因此它可能不适合您的用例。

【讨论】:

是的,我遇到的问题实际上是在使用 UIKeyboardAppearanceDark 时发生的。问题是我无法在截图过程中捕捉到键盘的透明度。

以上是关于模糊包含键盘及其下方内容的 UIView (iOS 7)的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 隐藏在键盘后面的 UIView 容器

iOS中键盘和UIView之间出现空白

位于虚拟键盘下方的 iOS 7.1 输入字段强制缩放焦点

如果键盘阻止了文本视图,则移动 UIView

如何在 iOS6 中的 UIView 上获得高斯模糊效果

如何在iOS中的UIView子视图下方插入UILabel