77

Приложение App Store на iOS 7 использует эффект матового стекла, где можно увидеть вид сзади. Это использование API, встроенного в iOS 7, или это настраиваемый код. Я надеялся, что это будет первый, но я не вижу никаких очевидных ссылок в документации. Очевидные вещи, подобные (например, установка свойства alpha на модальном представлении), похоже, не имеют никакого эффекта.iOS 7 Прозрачный контроллер Modal View

Чтобы увидеть пример, откройте приложение App Store и нажмите кнопку в правом верхнем углу.

App Store home page Modal view in the App Store

+0

Мне нравится ваш вопрос –

+0

@Ian - вы должны согласиться с ответом Себастьяна Ходжаса – galambalazs

ответ

131

С выпуском прошивки 8.0, нет необходимости для получения изображения и размывания его больше. Как указывалось в Andrew Plummer, вы можете использовать UIVisualEffectView с UIBlurEffect.

UIViewController * contributeViewController = [[UIViewController alloc] init]; 
UIBlurEffect * blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; 
UIVisualEffectView *beView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; 
beView.frame = self.view.bounds; 

contributeViewController.view.frame = self.view.bounds; 
contributeViewController.view.backgroundColor = [UIColor clearColor]; 
[contributeViewController.view insertSubview:beView atIndex:0]; 
contributeViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext; 

[self presentViewController:contributeViewController animated:YES completion:nil]; 

Решение, которое работает до того прошивкой 8

Я хотел бы продлить на ответ rckoenes':

Как подчеркивалось, вы можете создать этот эффект:

  1. Преобразование базового UIView в UIImage
  2. Blur the UIImage
  3. Установите UIImage как фон вашего вида.

enter image description here


Кажется, что много работы, но на самом деле делается довольно просто:

1. Создайте категорию UIView и добавить следующий метод:

-(UIImage *)convertViewToImage 
{ 
    UIGraphicsBeginImageContext(self.bounds.size); 
    [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

2. Сделайте изображение текущий вид и размойте его с помощью Apple's Image Effect category (download)

UIImage* imageOfUnderlyingView = [self.view convertViewToImage]; 
imageOfUnderlyingView = [imageOfUnderlyingView applyBlurWithRadius:20 
          tintColor:[UIColor colorWithWhite:1.0 alpha:0.2] 
       saturationDeltaFactor:1.3 
          maskImage:nil]; 

3. Установите его в качестве фона вашего наложения.

-(void)viewDidLoad 
{ 
    self.view.backgroundColor = [UIColor clearColor]; 
    UIImageView* backView = [[UIImageView alloc] initWithFrame:self.view.frame]; 
    backView.image = imageOfUnderlyingView; 
    backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6]; 
    [self.view addSubview:backView]; 
} 
+10

Я тебя люблю. Спасибо. –

+2

https://developer.apple.com/downloads/download.action?path=wwdc_2013/wwdc_2013_sample_code/ios_uiimageeffects.zip - Прямая ссылка на Image Effects Категория – OneManBand

+0

@OneManBand Добавил ссылку. Благодаря! –

11

Там нет API доступен в IOS 7 SDK, который позволит «мороз» нижележащий вид контроллера.

Что я сделал, это сделать подстилающий вид изображению, которое я затем замерзает и установить в качестве фона представление, которое представлено.

Apple, обеспечивает хороший пример этого: https://developer.apple.com/downloads/index.action?name=WWDC%202013

Проект, который вы хотите называется, iOS_RunningWithASnap

+0

и как вы можете сохранить обратный ViewController, пока модально вверх? в моем случае обратный VC уходит. –

+0

У вас нет со времени обратного просмотраController - это просто матовое изображение на модульном контроллере просмотра. – rckoenes

5

Как сказал @rckoenes, нет Apple не предусмотрено рамки, чтобы получить этот эффект. Но некоторые люди там уже построили хорошие альтернативы, как этот, например:

https://github.com/JagCesar/iOS-blur/

4

Я загрузил мой захват размытого контроллера вида на [GitHub] [1]. Он также поставляется с подклассом segue, поэтому вы можете использовать его в своих раскадках.

Repository: https://github.com/datinc/DATBlurSegue

+0

Представляет представление с анимацией и поддерживается безопасным хранилищем приложений UIToolbar? –

+0

Работает ли это, если контроллер представления представления является контроллером uinavigation? –

4

Вместо представления ViewController как modalView, вы можете добавить его в детстве ViewController и создать пользовательская анимация. Тогда вам нужно будет только изменить представление по умолчанию viewController на UIToolBar в viewDidLoad.

Это позволит вам как можно ближе имитировать размытый модальный вид appstore.

8

С прошивкой 8, это работает:

 let vc = UIViewController() 
     vc.view = UIVisualEffectView(effect: UIBlurEffect(style: .Light)) 
     vc.modalPresentationStyle = .OverFullScreen 

     let nc = UINavigationController(rootViewController: vc) 
     nc.modalPresentationStyle = .OverFullScreen 

     presentViewController(nc, animated: true, completion: nil) 

Ключ .OverFullScreen флага и обеспечение viewControllers имеет размытость UIVisualEffectView, который является первым видимым видом.

24

Просто переписана решение Sebastian Hojas' в Swift:

1. Создать расширение UIView и добавить следующий метод:

extension UIView { 
    func convertViewToImage() -> UIImage{ 
     UIGraphicsBeginImageContext(self.bounds.size); 
     self.drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext(); 

     return image; 
    } 
} 

2. Сделайте изображение текущего вида и размытость с помощью эффекта изображения Apple (я нашел повторное выполнение этого в Swift: SwiftUIImageEffects

var imageOfUnderlyingView = self.view.convertViewToImage() 
imageOfUnderlyingView = imageOfUnderlyingView.applyBlurWithRadius(2, tintColor: UIColor(white: 0.0, alpha: 0.5), saturationDeltaFactor: 1.0, maskImage: nil)! 

3. Установите его в качестве фона вашего наложения.

let backView = UIImageView(frame: self.view.frame) 
backView.image = imageOfUnderlyingView 
backView.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5) 
view.addSubview(backView) 
+0

что круто ^^! –

+0

будет работать как для ориентации – Marios

14

Я думаю, что это самое простое решение для контроллера представления модального, что перекрывает все с хорошим размытием (iOS8)

UIViewController * contributeViewController = [[UIViewController alloc] init]; 

    UIBlurEffect * blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; 
    UIVisualEffectView *beView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; 
    beView.frame = self.view.bounds; 

    contributeViewController.view.frame = self.view.bounds; 
    contributeViewController.view.backgroundColor = [UIColor clearColor]; 
    [contributeViewController.view insertSubview:beView atIndex:0]; 
    contributeViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext; 

    [self presentViewController:contributeViewController animated:YES completion:nil]; 
+1

Наложение похоже будет добавлено на верхний слой – c9s

+1

Это не останется размытым? Используя метод iOS 8, фон размывается при переходе и прозрачно отображает первый контроллер представления, но модальный контроллер просмотра становится черным после полной загрузки.- Crashalot только что отредактировал – Crashalot

+0

@Crashalot, вы изменили какие-либо настройки, такие как изменение UIModalPresentationOverCurrentContext в полноэкранном режиме? –

9

Немного проще путь для достижения этой цели (на основе ответа Эндрю Пламмера) с интерфейсом Builder (также он удаляет побочный эффект, который появляется в ответе Эндрюса):

  • В IB добавьте визуальный эффект к вашему контроллеру View под вашими другими видами;
  • Сделайте верхние, нижние, левые, правые ограничения от визуального эффекта Просмотр в начало (родительский) Просмотр, установить все из них в 0;
  • Установить Blur Стиль;
  • Добавьте код, где вы представить свою новую причудливую View Controller:

UIViewController *fancyViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"yourStoryboardIDFOrViewController"]; 

fancyViewController.view.backgroundColor = [UIColor clearColor]; 
fancyViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext; 

[self presentViewController:fancyViewController 
        animated:YES 
       completion:nil]; 

На самом деле, вторые и третьи линии очень важно - в противном случае контроллер будет мигать, а затем чернеет.

+0

Что такое mainButtonViewController? – christijk

+0

@christijk это должен быть fancyViewController (это сейчас). Спасибо, что указали. –

0

Вы можете использовать UIToolbar в качестве фона. По умолчанию UIToolbar имеет высоту 50 пикселей. Добавьте ограничения автоматической компоновки на UIToolbar. Затем выберите ограничение по высоте и измените его.

Иерархия будет выглядеть следующим образом:

UIView -> clear colour for background. 
- UIToolbar 
- Other contents. 
1

компания Apple выпустила UIImageEffect категорию для этих эффектов. Эта категория должна быть добавлена ​​вручную в проект, и она поддерживает iOS7.

Смежные вопросы