Вид размытия в стиле iOS 7

Кто-нибудь знает какие-либо элементы управления, которые будут воспроизводить размытые стили iOS7.

Я уверен, что может быть какой-то подкласс UIView, который будет реплицировать поведение.

Я говорю об этих типах, которые сильно размывают фон так, что они имеют эффекты выталкивания из фонового представления.

enter image description here

Ответ 1

Возможно, вы сможете изменить что-то вроде Bin Zhang RWBlurPopover. Этот компонент использует мой GPUImage для применения размытия Gaussian к компонентам под ним, но вы можете так же легко использовать CIGaussianBlur для этого. GPUImage может быть волосы быстрее, чем.

Этот компонент полагается на то, что вы можете захватить представление за тем, который вы представляете, и могут иметь проблемы с представлениями, которые оживляют этот контент. Необходимость совершить поездку через Core Graphics для растрирования фонового представления замедлит работу, поэтому мы, вероятно, не имеем достаточно прямого доступа, чтобы быть в состоянии сделать это с помощью приложения для оверлеев при анимационных представлениях.

Как обновление вышеизложенного, я недавно переработал размытия в GPUImage для поддержки переменных радиусов, что позволило полностью реплицировать размер размытия в виде центра управления iOS 7. Из этого я создал класс GPUImageiOS7BlurFilter, который инкапсулирует правильный размер размытия и цветокоррекцию, которые Apple, по-видимому, использует здесь. Так как размытие GPUImage (справа) сравнивается со встроенным размытием (слева):

Apple's blurGPUImage's blur

Я использую 4X понижающую дискретизацию/повышающую дискретизацию, чтобы уменьшить количество пикселов, которые должно обладать гауссовским размытием, поэтому iPhone 4S может размыть весь экран примерно за 30 мс, используя эту операцию.

У вас все еще есть проблема с тем, как потянуть контент в это размытие из представлений позади этого по-своему.

Ответ 2

Я использую FXBlurView, который отлично работает на iOS5 +

https://github.com/nicklockwood/FXBlurView

CocoaPods:

-> FXBlurView (1.3.1)
   UIView subclass that replicates the iOS 7 realtime background blur effect, but works on iOS 5 and above.
   pod 'FXBlurView', '~> 1.3.1'
   - Homepage: http://github.com/nicklockwood/FXBlurView
   - Source:   https://github.com/nicklockwood/FXBlurView.git
   - Versions: 1.3.1, 1.3, 1.2, 1.1, 1.0 [master repo]

Я добавил его, используя:

FXBlurView *blurView = [[FXBlurView alloc] initWithFrame:CGRectMake(50, 50, 150, 150)];
[self.blurView setDynamic:YES];
[self.view addSubview:self.blurView];

Ответ 3

ПРЕДУПРЕЖДЕНИЕ: кто-то в комментариях заявил, что Apple отклоняет приложения, используя эту технику. Это НЕ произошло со мной, но только для вашего рассмотрения.

Это может вас удивить, но вы можете использовать UIToolbar, который уже включает этот стандартный эффект (только iOS 7+). В представлении контроллера viewDidLoad:

self.view.opaque = NO;
self.view.backgroundColor = [UIColor clearColor]; // Be sure in fact that EVERY background in your view hierarchy is totally or at least partially transparent for a kind effect!

UIToolbar *fakeToolbar = [[UIToolbar alloc] initWithFrame:self.view.bounds];
fakeToolbar.autoresizingMask = self.view.autoresizingMask;
// fakeToolbar.barTintColor = [UIColor white]; // Customize base color to a non-standard one if you wish
[self.view insertSubview:fakeToolbar atIndex:0]; // Place it below everything

Ответ 5

Лучший новый способ получить blured Overlay - использовать новую функцию iIV 8 UIVisualEffectView.

UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

UIVisualEffectView *bluredView = [[UIVisualEffectView alloc] initWithEffect:effect];

bluredView.frame = self.view.bounds;

[self.view addSubview:bluredView];

UIBlurEffect поддерживает три типа стиля. Темный, Светлый и ExtraLight.

Ответ 6

Вы можете создать класс с UIToolBar, который является подклассом UIView и создать его в отдельном контроллере представления. Этот подход демонстрирует полупрозрачный UIToolBar (подклассом UIView), который обеспечивает прямую обратную связь (в данном случае для AVCaptureSession).

YourUIView.h

#import <UIKit/UIKit.h>

@interface YourUIView : UIView
@property (nonatomic, strong) UIColor *blurTintColor;
@property (nonatomic, strong) UIToolbar *toolbar;
@end

YourUIView.m

#import "YourUIView.h"

@implementation YourUIView

- (instancetype)init
{
    self = [super init];
    if (self) {
        [self setup];
    }
    return self;
}

- (void)setup {
    // If we don't clip to bounds the toolbar draws a thin shadow on top
    [self setClipsToBounds:YES];

    if (![self toolbar]) {
        [self setToolbar:[[UIToolbar alloc] initWithFrame:[self bounds]]];
        [self.toolbar setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self insertSubview:[self toolbar] atIndex:0];

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_toolbar]|"
                                                                     options:0
                                                                     metrics:0
                                                                       views:NSDictionaryOfVariableBindings(_toolbar)]];
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_toolbar]|"
                                                                     options:0
                                                                     metrics:0
                                                                       views:NSDictionaryOfVariableBindings(_toolbar)]];
    }
}

- (void) setBlurTintColor:(UIColor *)blurTintColor {
    [self.toolbar setBarTintColor:blurTintColor];
}

@end

После того, как вышеуказанный UIView был настроен, продолжайте и создайте класс, который является подклассом ViewController. Ниже я создал класс, который использует сеанс AVCapture. Вы должны использовать AVCaptureSession, чтобы переопределить конфигурацию камеры, встроенную в камеру. Таким образом, вы можете наложить транскрипционный UIToolBar из класса YourUIView.

YourViewController.h

#import <UIKit/UIKit.h>

@interface YourViewController : UIViewController
@property (strong, nonatomic) UIView *frameForCapture;
@end

YourViewController.m

#import "YourViewController.h"
#import <AVFoundation/AVFoundation.h>
#import "TestView.h"

@interface YourViewController ()
@property (strong, nonatomic) UIButton *displayToolBar;

@end

@implementation YourViewController


AVCaptureStillImageOutput *stillImageOutput;
AVCaptureSession *session;

- (void) viewWillAppear:(BOOL)animated
{
    session = [[AVCaptureSession alloc] init];
    [session setSessionPreset:AVCaptureSessionPresetPhoto];

    AVCaptureDevice *inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    NSError *error;
    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:&error];

    if ([session canAddInput:deviceInput]) {
        [session addInput:deviceInput];
    }

    AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
    [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
    CALayer *rootLayer = [[self view] layer];
    [rootLayer setMasksToBounds:YES];
    CGRect frame = [[UIScreen mainScreen] bounds];

    self.frameForCapture.frame = frame;

    [previewLayer setFrame:frame];

    [rootLayer insertSublayer:previewLayer atIndex:0];

    stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
    NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG, AVVideoCodecKey, nil];
    [stillImageOutput setOutputSettings:outputSettings];

    [session addOutput:stillImageOutput];

    [session startRunning];

    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];
}


- (void)viewDidLoad
{
    [super viewDidLoad];

    /* Open button */

    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 350, self.view.bounds.size.width, 50)];
    [button addTarget:self action:@selector(showYourUIView:) forControlEvents:UIControlEventTouchUpInside];
    [button setTitle:@"Open" forState:UIControlStateNormal];
    [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    button.backgroundColor = [UIColor greenColor];
    [self.view addSubview:button];

    UIButton *anotherButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, 50)];
    [anotherButton addTarget:self action:@selector(showYourUIView:) forControlEvents:UIControlEventTouchUpInside];
    [anotherButton setTitle:@"Open" forState:UIControlStateNormal];
    [anotherButton setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];
    anotherButton.backgroundColor = [UIColor redColor];
    [self.view addSubview:anotherButton];

}

- (void) showYourUIView:(id) sender
{
    TestView *blurView = [TestView new];
    [blurView setFrame:self.view.bounds];
    [self.view addSubview:blurView];
}


@end