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

时间:2013-10-27 08:25:55

标签: ios uiview ios7 uikeyboard uigraphicscontext

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

- (UIImage *)screenshotFromView:(UIView *)view;
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0);
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];

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

    return image;
}

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

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

2 个答案:

答案 0 :(得分:2)

这些天我遇到了确切的问题,所以我完全知道你想要什么。我希望整个用户界面模糊在包括键盘在内的消息后面,这不包括在任何常规的截屏方法中。我的解决方法是以下代码:

- (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的任何开发人员规则,我还不知道。目前我没有看到任何问题,但我会进一步调查,因为我想用这个图形技巧发布我的应用程序。我会更新这篇文章。与第一点一样,我非常感谢有关此问题的任何评论。

答案 1 :(得分:0)

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