iOS7スタイルのぼかしビューを複製するコントロールを知っている人はいますか?
動作を複製するUIViewサブクラスの種類があると思います。
これらのタイプのビューとは、背景を非常に濃くぼかし、背景ビューからの引き寄せ効果があるタイプのビューのことです。
iOS7スタイルのぼかしビューを複製するコントロールを知っている人はいますか?
動作を複製するUIViewサブクラスの種類があると思います。
これらのタイプのビューとは、背景を非常に濃くぼかし、背景ビューからの引き寄せ効果があるタイプのビューのことです。
回答:
これを行うには、Bin ZhangのRWBlurPopoverなどを変更できる場合があります。そのコンポーネントは、私のGPUImageを使用して、その下のコンポーネントにガウスぼかしを適用しますが、CIGaussianBlurを同じように簡単に使用することもできます。ただし、GPUImageは髪の毛の方が速いかもしれません。
ただし、そのコンポーネントは、提示しているビューの背後にあるビューをキャプチャできることに依存しており、このコンテンツの背後でアニメーション化するビューでは問題が発生する可能性があります。コアグラフィックスを経由して背景ビューをラスタライズする必要があるため、処理速度が低下するため、アニメーションビューのオーバーレイでこれを実行するための十分な直接アクセス権がない可能性があります。
上記の更新として、私は最近、可変半径をサポートするようにGPUImageのブラーを作り直し、iOS 7のコントロールセンタービューでブラーサイズを完全に複製できるようにしました。それから、Appleがここで使用しているように見える適切なぼかしサイズと色補正をカプセル化するGPUImageiOS7BlurFilterクラスを作成しました。これは、GPUImageのぼかし(右側)と組み込みのぼかし(左側)の比較です。
4Xダウンサンプリング/アップサンプリングを使用して、ガウスぼかしが動作する必要があるピクセルの数を減らします。そのため、iPhone 4Sはこの操作を使用して約30 msで画面全体をぼかすことができます。
コンテンツをこのブラーの背後にあるビューからパフォーマンスの高い方法でこのブラーに引き込む方法には、まだ課題があります。
私は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];
FXBlurView
上に置くと、UIScrollView
私も遅れた結果を得ました。これは、ぼかしを追加する方法に関係していると思います。Appleは、私が誤解していない限り、独自のブラーを使用するときにGPUに直接アクセスしますが、これは開発者として行うことはできません。したがって、@ cprcrackソリューションが実際にはここでの最良のソリューションです。
警告:コメントの誰かが、Appleがこの手法を使用するアプリを拒否すると述べました。それは私には起こりませんでしたが、あなたの考慮のためです。
これには驚かれるかもしれませんが、UIToolbarを使用できます。UIToolbarには、すでにその標準的な効果が含まれています(iOS 7以降のみ)。あなたはコントローラのviewDidLoadを表示します:
self.view.opaque = NO;
self.view.backgroundColor = [UIColor clearColor]; // Be sure in fact that EVERY background in your view's 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
viewDidLoad
このように1行だけ変更しました。-(void)viewDidLoad {[super viewDidLoad]; self.view = [[UIToolbar alloc] initWithFrame:CGRectZero]; 私の場合、ビューをプログラムでレイアウトします(古いスタイル)。UIToolbarはUIViewを継承するため、このソリューションに賛成票を投じます。このソリューションでは基本的に問題は発生しません。このソリューションの開発とテストを進めながら、さらにテストを行います。
iOS8ので、あなたは使用することができUIBlurEffectを。
UIBlurEffectとUIVibrancyEffectを使用したiOS8Samplerの良い例があります。
UIVisualEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]; UIVisualEffectView *blurView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
ぼやけたオーバーレイを取得するための最良の新しい方法は、新しいiOS 8機能UIVisualEffectViewを使用することです。
UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
UIVisualEffectView *bluredView = [[UIVisualEffectView alloc] initWithEffect:effect];
bluredView.frame = self.view.bounds;
[self.view addSubview:bluredView];
UIBlurEffectは3種類のスタイルをサポートします。ダーク、ライト、エクストラライト。
UIViewのサブクラスであるUIToolBarを使用してクラスを作成し、別のビューコントローラーでインスタンス化できます。このアプローチは、ライブフィードバック(この場合はAVCaptureSessionの場合)を提供する(UIViewによってサブクラス化された)半透明のUIToolBarを示しています。
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セッションを使用するクラスを作成しました。Appleの組み込みカメラ構成をオーバーライドするには、AVCaptureSessionを使用する必要があります。したがって、YourUIViewクラスからの半透明のUIToolBarをオーバーレイできます。
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