Размытие UIView, содержащего клавиатуру с содержимым под ней (iOS 7)

У меня есть 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, сохранив при этом прозрачность клавиатуры и строки состояния?


person bdev    schedule 27.10.2013    source источник
comment
Можете ли вы уточнить, вы хотите сделать снимок экрана с клавиатурой, чтобы размыть его? Отображать ли его после закрытия приложения, чтобы размыть важную информацию, чтобы она не была видна на панели многозадачности?   -  person Tancrede Chazallet    schedule 21.11.2013


Ответы (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;
}

Я почерпнул эту идею из статьи Арана Балкана. Я разбил ее на один метод и протестировал для iOS 7, который кажется, работает для меня. Статью стоит прочитать, так как он немного объясняет приемы. Поскольку вам нужна только фактическая клавиатура в качестве изображения, вы можете закомментировать строку, которую я отметил в коде. С этой клавиатурой изображения вы можете сами делать размытие. Код далек от совершенства, но я думаю, что вы поняли идею.

Два мысли в конце: я новичок в разработке Objective C и iOS. Если вы обнаружите какие-либо проблемные ошибки, очень приветствуется комментарий, чтобы улучшить этот ответ. Во-вторых, я написал этот код сегодня в своем приложении, и я еще не знаю, нарушаю ли я какие-либо правила разработчика для iOS. На данный момент я не вижу никаких проблем, но я буду исследовать это дальше, поскольку я хочу выпустить свое приложение с этим графическим трюком. Я буду обновлять этот пост. До тех пор, как и в случае с первым пунктом, я был бы очень признателен за любые комментарии по этому вопросу.

person Martin Schlott    schedule 22.11.2013
comment
Спасибо за ваш комментарий Мартин! Хотя приведенный выше код захватывает клавиатуру, он, к сожалению, не захватывает прозрачность клавиатуры. Таким образом, если за содержимым находится какой-либо цветной контент, переход размытия будет продолжать выглядеть неуклюже — в том смысле, что он выглядит так, как будто цветной контент удаляется во время размытия. - person bdev; 25.11.2013
comment
@bdev Да, похоже, я был так рад помочь, что не понял вашей настоящей проблемы. Извини за это. - person Martin Schlott; 25.11.2013

Рассматривали ли вы возможность использования UIKeyboardAppearanceDark? В настоящее время значение по умолчанию keyboardAppearance соответствует UIKeyboardAppearanceLight, поэтому он может не подходить для вашего варианта использования.

person Arek Holko    schedule 22.11.2013
comment
Да, проблема, с которой я сталкиваюсь, на самом деле возникает при использовании UIKeyboardAppearanceDark. Проблема в том, что я не могу передать прозрачность клавиатуры во время скриншота. - person bdev; 25.11.2013