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

标签 ios uiview ios7 uikeyboard uigraphicscontext

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

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

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

    return image;
}

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

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

最佳答案

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

- (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 进行了测试,这似乎对我有用。这篇文章值得一读,因为他解释了一些背后的技巧。因为你只想要实际的键盘作为图像,你可以注释掉我在代码中标记的行。使用该图像键盘,您可以自己进行模糊处理。 代码远非完美,但我认为您明白了。

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

关于ios - 模糊包含键盘及其下方内容的 UIView (iOS 7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19616051/

相关文章:

ios - 以编程方式更改 UIPageViewController 的页面不会更新 UIPageControl

ios - 如何在 Swift 3 中使用 NSLocale 获取国家代码

ios - AVAudioUnitSampler 在耳机路由更改后生成正弦波,iOS 11 iPhone

ios - 如何在 UITableView 中找到屏幕中心的哪一行/单元格?

ios - 如何在社交媒体帖子中显示 UIView

swift - 添加 subview 并使用自动布局将前缘与 super View 和环绕 View 对齐

objective-c - UIPopover 不显示内部 View

iphone - iOS6和iOS7之间UIScreenbounds和applicationFrame的区别

ipad - Xcode 5中的iPad启动图像仅接受视网膜或非视网膜,但不能同时接受

iphone - iOS7 忽略视网膜 css 媒体查询 - 背景大小