iOS 7 Translucent Modal View-controller

De App Store-app op iOS 7 gebruikt een matglas-achtig effect waarbij het mogelijk is om het zicht erachter te zien. Gebruikt dit een API die is ingebouwd in iOS 7 of is het aangepaste code. Ik hoopte dat het het eerste zou zijn, maar ik zie geen duidelijke verwijzingen in de documentatie. Voor de hand liggende dingen zoals (zoals het instellen van de alfa-eigenschap in de modale weergave) lijken geen effect te hebben.

Om een ​​voorbeeld te zien, open je de App Store-app en druk je op de knop rechtsboven.

App Store-startpagina
Modale weergave in de App Store


Antwoord 1, autoriteit 100%

Met de release van iOS 8.0 is het niet meer nodig om een ​​afbeelding te maken en deze te vervagen. Zoals Andrew Plummeropmerkte, kun je UIVisualEffectViewmet 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];

Oplossing die werkt vóór iOS 8

Ik wil graag uitbreiden op het antwoord van rckoenes:

Zoals benadrukt, kunt u dit effect creëren door:

  1. Converteer de onderliggende UIView naar een UIImage
  2. Vervaag de UIImage
  3. Stel de UIImage in als achtergrond van uw weergave.

voer hier de afbeeldingsbeschrijving in


Klinkt als veel werk, maar is eigenlijk vrij eenvoudig gedaan:

1. Maak een categorie van UIView en voeg de volgende methode toe:

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

2. Maak een afbeelding van de huidige weergave en vervaag deze met Apple’s categorie Afbeeldingseffect(download)

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

3. Stel het in als achtergrond van je overlay.

-(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];
}

Antwoord 2, autoriteit 19%

Zojuist de oplossing van Sebastian Hojas opnieuw geïmplementeerd in Swift:

1. Maak een UIView-extensie en voeg de volgende methode toe:

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

2. Maak een afbeelding van de huidige weergave en vervaag deze met behulp van Apple’s Image Effect (ik vond hier een herimplementatie hiervan in 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. Stel het in als achtergrond van je overlay.

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

Antwoord 3, autoriteit 11%

Ik denk dat dit de gemakkelijkste oplossing is voor een modal view-controller die alles met een mooie vervaging bedekt (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];

Antwoord 4, autoriteit 9%

Er is geen API beschikbaar in de iOS 7 SDK waarmee u de onderliggende weergavecontroller kunt “bevriezen”.

Wat ik heb gedaan, is de onderliggende weergave naar een afbeelding renderen, die ik vervolgens mat en die als achtergrond instelde voor de weergave die wordt gepresenteerd.

Apple geeft hier een goed voorbeeld van: https://developer. apple.com/downloads/index.action?name=WWDC%202013

Het gewenste project heet iOS_RunningWithASnap


Antwoord 5, autoriteit 8%

Een iets eenvoudigere manier om dit te bereiken (gebaseerd op het antwoord van Andrew Plummer) met Interface Builder (het verwijdert ook de bijwerking die in het antwoord van Andrew voorkomt):

  • Voeg in IB Visual Effect View toe aan uw View Controller onder uw andere views;
  • Maak beperkingen voor boven, onder, links, rechts van de visuele effectweergave naar de bovenliggende (bovenliggende) weergave, stel ze allemaal in op 0;
  • Vervagingsstijl instellen;
  • Voeg de code toe waar je je nieuwe mooie View Controller presenteert:

UIViewController *fancyViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"yourStoryboardIDFOrViewController"];
fancyViewController.view.backgroundColor = [UIColor clearColor];
fancyViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
[self presentViewController:fancyViewController
                   animated:YES
                 completion:nil];

Eigenlijk zijn de tweede en derde regel ZEER belangrijk – anders knippert de controller en wordt dan zwart.


Antwoord 6, autoriteit 7%

Sinds iOS 8 werkt dit:

       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)

De sleutel is de vlag .OverFullScreenen zorgt ervoor dat de viewControllers een wazig UIVisualEffectView hebben dat de eerste zichtbare weergave is.


Antwoord 7, autoriteit 5%

Zoals @rckoenes al zei, is er geen door Apple geleverd raamwerk om dat effect te krijgen. Maar sommige mensen hebben al goede alternatieven gebouwd, zoals deze bijvoorbeeld:

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


Antwoord 8, autoriteit 4%

Een paar alternatieve benaderingen die ook werken op iOS 5 en 6:

FXBlurView: https://github.com/nicklockwood/FXBlurView

iOS RealtimeBlur: https://github.com/alexdrone/ios-realtimeblur


Antwoord 9, autoriteit 4%

Ik heb mijn versie van de wazige weergave-controller geüpload naar [GitHub][1]. Het wordt ook geleverd met een segue-subklasse, zodat je het in je storyboards kunt gebruiken.

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


Antwoord 10, autoriteit 4%

Snel & gemakkelijke oplossing
met XIB-ondersteuning die je kunt gebruiken voor de oude schooljongens
https://github.com/cezarywojcik/CWPopup


Antwoord 11, autoriteit 4%

In plaats van de viewController als een modalView te presenteren, kunt u deze toevoegen als een onderliggende viewController en een aangepaste animatie maken. U hoeft dan alleen de standaardweergave van de viewController te wijzigen in een UIToolBar in viewDidLoad.

Hierdoor kunt u de wazige modale weergave van de appstore zo goed mogelijk nabootsen.


Antwoord 12, autoriteit 2%

Apple heeft de UIImageEffectcategorie voor die effecten. Die categorie moet handmatig aan het project worden toegevoegd en het ondersteunt iOS7.


Antwoord 13

U kunt UIToolbar als achtergrond gebruiken.
Standaard heeft UIToolbar een hoogte van 50px.
Voeg automatische lay-outbeperkingen toe aan de UIToolbar.
Selecteer vervolgens de hoogtebeperking en wijzig deze.

Hiërarchie ziet er als volgt uit:

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

Other episodes