關於自定義毛玻璃的隨筆(三方使用的翻譯)


    寫項目登錄頁面的背景圖的時候, 要用到毛玻璃, 想要的效果是這樣的:

 

 

 

於是我用系統提供的毛玻璃的方法寫了出來:

UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
    UIVisualEffectView *visualView = [[UIVisualEffectView alloc] initWithEffect:effect];
    visualView.frame = [[UIScreen mainScreen] bounds];
    [self.backgroundImageView addSubview:visualView];
    visualView.alpha = 0.6;

效果如下:

可以看出來, 模糊效果不明顯,並不是想要的效果, 然后又試了UIBlurEffectStyleLight和extraLight, 也不是想要的效果, 於是乎, 我從網上開始找可以自定義毛玻璃的的三方...終於, 皇天不負有心人.

三方的地址:https://github.com/nicklockwood/FXBlurView
但是發現里面都是英文, 於是准備翻譯一下, 以備以后使用.
FXBlurView是UIView子類,替換iOS 7實時背景模糊效果,但適用於iOS 5以上。它被設計的更快速和更易於使用。FXBlurView提供了兩種操作模式:靜態,視圖呈現時只有一次添加到父視圖(盡管它可以通過調用setNeedsDisplay更新或updateAsynchronously:completion:)或動態的,它會盡可能自動重新繪制在一個后台線程。

支持iOS & SDK版本

構建目標——支持iOS 8.4(Xcode 8.4,蘋果LLVM 6.1編譯器)

最早的部署目標- iOS 7.0的支持

最早的部署目標——iOS 4.3兼容

注:“支持”意味着這個版本的庫已經被測試。“兼容”意味着圖書館應工作在這個iOS版本(即它不依賴任何不可用SDK特性),但不再進行兼容性測試,可能需要調整或bug修復以正確運行。

 ARC的兼容性

從版本1.3開始,FXBlurView需要ARC。如果你想使用FXBlurView 在一個non-ARC的項目中時,只需在FXBlurView.m這個類添加 -fobjc-arc編譯器標志。要做到這一點,去構建階段目標設置的選項卡,打開Compile Sources,雙擊FXBlurView.m, 然后在彈出窗口中添加-fobjc-arc。

如果你希望你的整個項目轉化成ARC,注釋掉FXBlurView.m 中錯誤的地方, 然后運行Edit> Refactor >Convert to Objective-C ARC …Xcode中的工具,確保您希望使用ARC的所有文件(包括FXBlurView.m)被檢查。

安裝

使用FXBlurView,把類文件拖拽到你的項目並添加Accelerate框架。您可以創建FXBlurView編程實例,或在Interface Builder中創建它們通過拖拽一個普通UIView到你的viewFXBlurView查看和設置它的類。

如果您使用的是界面構建器(Interface Builder),設置自定義屬性的FXBlurView(那些不支持的正則uiview)要么創建一個IBOutlet查看和設置屬性在代碼中,或在Interface Builder中使用用戶定義運行時屬性特性(在Xcode 4.2中引入的iOS 5 +)。

UIImage擴展

FXBlurView擴展用戶界面圖像用以下方法:

- (UIImage *)blurredImageWithRadius:(CGFloat)radius
                         iterations:(NSUInteger)iterations
                          tintColor:(UIColor *)tintColor
這種方法適用於模糊效果並返回結果沒有修改原始圖像。半徑屬性控制的程度模糊效果。迭代屬性控制的迭代次數。更多的迭代意味着高質量。tintColor是一個可選顏色,將混合合成圖像。注意的對tintColor的透明度設置會被忽略。


FXBlurView方法

+(void)setBlurEnabled:(BOOL)blurEnabled;

該方法可用於全球啟用/禁用所有FXBlurView實例的模糊效果。這是用於測試,或者如果你想禁用下面模糊在iPhone 4和(與iOS7模糊視圖一致性行為)。默認情況下啟用模糊。+(void)setUpdatesDisabled;

這些方法可用於啟用和禁用更新對於所有的動態FXBlurView實例和一個命令。用於禁用更新之前立即執行一個動畫,這樣FXBlurView的更新不會引起動畫的卡頓。調用可以嵌套,但確保啟用/禁用調用是平衡,或更新將會永久地啟用或禁用。

- (void)updateAsynchronously:(BOOL)async completion:(void (^)())completion;
這種方法可以用來觸發一個更新的模糊效果(有用當動態= NO)。異步參數控制是否模糊將重繪在主線程或背景。完成參數是一個可選的回調元件,它將被稱為模糊時完成。

-(void)setNeedsDisplay;

從UIView繼承,這個方法可以用來觸發一個視圖的更新(同步)。調用這個方法或多或少相當於調用[view updateAsynchronously:NO completion:NULL]。

FXBlurView屬性

 
@property (nonatomic, getter = isBlurEnabled) BOOL blurEnabled;
這個屬性切換為個體FXBlurView實例模糊了。模糊是默認啟用。注意,如果您使用+ setBlurEnabled方法禁用模糊那將會覆蓋該設置。

@property (nonatomic, getter = isDynamic) BOOL dynamic;
這個屬性控制是否FXBlurView更新動態,或者只有一次當視圖添加到它的父視圖。默認值為YES。注意,如果動態設置為不,你仍然可以迫使視圖更新通過調用setNeedsDisplay或updateAsynchronously:completion:完成。動態模糊極其cpu密集型任務,因此你應該禁用動態視圖立即執行一個動畫之前,以避免卡頓。然而,如果你有多個FXBlurViews屏幕上那么簡單的禁用更新使用setUpdatesDisabled方法而不是設置動態屬性。

@property (nonatomic, assign) NSUInteger iterations;
模糊迭代的數量。更多的迭代改進了但質量降低了性能。默認為2的迭代。

@property (nonatomic, assign) NSTimeInterval updateInterval;
這個控件之間的時間間隔(以秒為單位)連續更新當FXBlurView在動態模式下操作。這個默認為0,這意味着FXBlurView將盡快更新。這收益最好的幀速率,但也很耗CPU, 這可能導致應用程序的其他性能降低,尤其是在舊設備。要實現這一點,試着增加updateInterval的數值。

@property (nonatomic, assign) CGFloat blurRadius; 
這個屬性控制模糊效果的半徑(點)。默認為40點的半徑,這是類似於iOS 7模糊效果。

@property (nonatomic, strong) UIColor *tintColor;
這在一個可選的色調顏色應用於FXBlurView。顏色的RGB分量將混合模糊圖像,導致溫和的色彩。不同色彩的強度效應,使用光明或黑暗的顏色。對tintColor透明度(alpha)的設置會被忽略。如果您不希望應用色彩,將這個值設置為零或(用戶界面顏色clearColor]。請注意,如果您正在使用Xcode 5以上,FXBlurViews接口中創建默認構建器將有一個藍色的色調。

@property (nonatomic, weak) UIView *underlyingView;
這個屬性指定視圖FXBlurView將示例創建模糊效果。如果設置為零(默認),這將是模糊視圖的父視圖本身,但你可以重寫它如果你需要的話。

常見問題解答

問:為什么我的觀點都框在iOS 7日嗎?
a . FXBlurView使用“UIView”“tintColor”屬性,不存在於iOS 6和下面,但是在iOS 7日默認為藍色。只是將此屬性設置為'(用戶界面顏色clearColor]“禁用色彩。保留iOS 6兼容,您可以設置使用代碼,或通過使用用戶定義運行時屬性接口生成器的功能,這將覆蓋標准“tintColor”值(參見示例項目nib如何做到這一點)。

問:FXBlurView使我的整個應用程序上運行緩慢(舊設備),我能做什么? 答:為了提高性能,嘗試增加“updatePeriod”屬性,減少“迭代”財產或禁用“動態”,除非你真的需要它。如果一切都失敗了,老設備上設置“blurEnabled”沒有。 問:我的SpriteKit / OpenGL /視頻/ 3 d轉換內容顯示不正確放置在一個FXBlurView時,為什么不呢? 答:這是一個限制的“CALayer”“renderInContext:”方法用於獲取視圖的內容。沒有解決方案在iOS 6和早些時候。在iOS 7日你可以利用“UIView”“drawViewHierarchyInRect:afterScreenUpdates:”方法來捕獲一個視圖和應用模糊效果,但這它太慢實時使用,所以FXBlurView默認不使用這種方法。 問:FXBlurView不是捕捉一些普通視圖內容,為什么不呢? 答:FXBlurView默認捕捉它的直接父視圖的內容。如果父視圖是透明或部分透明,背后的內容顯示它不會被捕獲。您可以覆蓋“underlyingView”屬性來捕獲的內容如果您需要一個不同的視圖。 發布說明
1.6.4版本 blurredImageWithRadius:迭代:tintColor:現在如果圖像不ARGB格式 固定”:CGContextRestoreGState:無效的上下文0 x0。” 空的子層正在隱藏的快照,以防止renderInContext崩潰之前iOS 8 FXBlurView現在需要時自動使用慢drawViewHierarchyInRect方法捕獲的內容 1.6.3版本 FXBlurView圖像背景不再是透明/黑色,所以它可以作為一個半透明的疊加 underlyingView屬性現在是IBOutlet,所以它可以連接界面構建器 進口進入頭迅速更好的兼容性

使用的具體代碼如下所示:

- (void)viewDidLoad {

    [super viewDidLoad];

    UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];

    imageView.image = [UIImage imageNamed:@"Default-Port-hd47"];

    [self.view addSubview:imageView];

    

    FXBlurView * aview = [[FXBlurView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

    aview.tintColor = [UIColor whiteColor];  //前景顏色

    aview.blurRadius = 20.0;                 //模糊半徑

    aview.dynamic = YES;                     //動態改變模糊效果    

    [self.view addSubview:aview];

    

    FXBlurView * bview = [[FXBlurView alloc] initWithFrame:CGRectMake(0, 120, 100, 100)];

    bview.tintColor = [UIColor whiteColor];  //前景顏色

    bview.blurEnabled = YES;                //是否允許模糊,默認YES

    bview.blurRadius = 10.0;               //模糊半徑

    bview.dynamic = YES;                   //動態改變模糊效果

    bview.iterations = 2;                  //迭代次數:

    bview.updateInterval = 2.0;            //更新時間(不確定具體功能)

    /*

     blurRadius = 1.0 && dynamic = 100 的效果和 blurRadius = 10.0 && dynamic = 1的效果大致相同

     */    

    [self.view addSubview:bview];

    FXBlurView * cview = [[FXBlurView alloc] initWithFrame:CGRectMake(150, 0, 200, 200)];

    cview.blurRadius = 20.0;

    cview.tintColor = [UIColor whiteColor];

    [self.view addSubview:cview];

}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM