2012-07-22 93 views
33

我試圖在UIImageView中應用磨砂玻璃效果。iPhone SDK - 磨砂玻璃(iOS 7模糊)效果

我試圖執行我發現的in this question,但結果不可接受。 我想是這樣的:

Frosted Glass Effect

任何想法?

UPDATE:

此外,我們可以看到的iOS 7使用這種效果在很多地方。我們如何重現它?

+0

這裏的解決方案與UIToolbar: http://stackoverflow.com/a/19506076/774394 – 2013-10-21 22:51:56

+0

我在編輯2中提到過類似的東西 - 它使用UIToolbar也是 – 2013-10-22 08:40:20

+0

是的你是對的。但是這個解決方案在UIView動畫的動畫框/邊界上起作用。 – 2013-10-22 15:47:28

回答

51

約CoreImage一個很好的教程在這裏,展示如何應用濾鏡和更多:

http://www.raywenderlich.com/5689/beginning-core-image-in-ios-5

更新1

那麼的一點點研究之後,我最終發現,與OS X版本的庫相比,iOS的核心映像仍然不完整。所以我搜索了很多,我找到了兩個解決方案,其中一個更簡單,另一個更廣泛和更復雜的庫。

因此,例如,在幾行,我可以得到我想要的結果(其中originalImage是UIImage的應用效果):

GPUImageGaussianBlurFilter *blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; 
blurFilter.blurSize = 2; 
UIImage *blurImage = [blurFilter imageByFilteringImage:resizedImage]; 

更新2

在蘋果宣佈iOS 7之後,一些開發人員發現了一種解決方法,與Apple在默認的iOS應用程序中所做的相同,因爲Apple沒有爲此提供API。 The simplest and better solution, in my opinion, is this one。爲什麼我認爲這是最好的?因爲即使背後的某些視圖發生移動,模糊效果仍然很好,因爲我們預計它會起作用。但是,請記住,它依賴於iOS 7 SDK才能工作,如果Apple更改UIToolbar,則可能會有風險。

更新3

蘋果提到,在WWDC 2013(會話226 - iOS上實現引人入勝的用戶界面),他們將提供UIImage的一個類別類,稱爲的UIImage + ImageEffects(我GOOGLE了它,and found here,但它在Developer Portal - search for UIImageEffects in the search box中可用)。使用此類別,可以使用多種方法(光線,黑暗,具有特定顏色等)在靜態UIImage中應用模糊。另外,昨天I saw this component,發現它很有趣,因爲你可以在一個框架中應用效果(基於上述類別)。

UPDATE 4

最後,在iOS 8日,蘋果發佈了新的類,可以很容易地做直播模糊。使用UIVisualEffectUIVisualEffectView,您可以快速將實時模糊添加到您的應用程序。 Here is a good tutorial from Ryan Nystrom on how to use those classes (and in blur in general)

+4

您可能還需要將高斯模糊與白色混合,才能得到您上面要看的外觀,並且我將在某個時刻爲此進行專門的過濾。另外,我正要試驗紋理磨砂玻璃,就像這款着色器提供的一樣:http://coding-experiments.blogspot.com/2010/06/frosted-glass.html – 2012-07-23 16:15:51

+0

我該怎麼做?我覺得我沒有閱讀文檔的地方=(也無法編譯文檔 – 2012-07-24 07:43:16

+0

對於自定義過濾器,最好的參考是看看其他過濾器是如何工作的,例如,上面連接的紋理玻璃會可以通過使用自定義片段着色器來完成,因此您需要創建一個新的自定義過濾器(使用類似於模板的方式)並修改它們在OpenGL ES中提供的片段着色器。對於明亮的模糊,您可能能夠鏈接亮度濾鏡的高斯模糊,或者最差的情況下,爲亮化步驟創建一個具有自定義片段着色器的濾鏡組。核心文檔位於Readme.md文件中。 – 2012-07-24 14:01:31

1

看一看the Core Image Programming Guide。看起來好像stylize filterblur filter可能適合您的需求。我以前從未與Core Image合作過,但我認爲可能會有一些涉及他們的良好WWDC會話。該文檔有a basic piece of sample code here

+0

它看起來像iOS沒有所有的OS X的過濾器。你可以通過代碼NSArray * properties = [CIFilter filterNamesInCategory:kCICategoryBuiltIn]; NSLog(@「%@」,屬性);' – 2012-07-22 16:01:21

+0

沒有深入細節,你有沒有在iOS 6上運行該代碼? – Moshe 2012-07-22 19:25:36

+0

還沒有。檢查我自己的答案 - 解決! – 2012-07-22 21:06:00

21

解決方案適用於iOS 7和8,而無需使用CoreImage或CoreGraphics中的所有:

- (void)addBlurToView:(UIView *)view { 
    UIView *blurView = nil; 

    if([UIBlurEffect class]) { // iOS 8 
     UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight]; 
     blurView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; 
     blurView.frame = view.frame; 

    } else { // workaround for iOS 7 
     blurView = [[UIToolbar alloc] initWithFrame:view.bounds]; 
    } 

    [blurView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

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

(假設你不針對iOS版比7舊版本;如果你是,你必須測試else區塊中的iOS版本)

此解決方案適用於任何視圖,而不僅適用於圖像。

+0

非常有用的答案,可以很容易地爲ios 7和8實現,只是一個問題,假設我不斷添加和刪除這個模糊的視圖,我應該刪除每次「從超級視圖中刪除視圖」時添加的約束「 (我使用這個代碼再次將它添加回來,所以我知道約束不斷添加) – Pochi 2014-10-03 03:39:28

+0

爲什麼不簡單地隱藏它而不是刪除它? – KPM 2014-10-03 08:17:43

+2

極好的例子。很棒。 – 2014-11-01 07:34:15

2

使用UIImageEffects

如果你申請的時候模糊想要更多的控制,你可以利用蘋果的UIImageEffects(通過他們的示例代碼可用)的。

您可以從蘋果的開發庫複製代碼爲UIImageEffectsBlurring and Tinting an Image

這裏是如何使用它:

#import "UIImageEffects.h" 
... 

self.yourImageView.image = [UIImageEffects imageByApplyingLightEffectToImage:[UIImage imageNamed:@"yourImage.png"]];