web-dev-qa-db-fra.com

Comment masquer UIViews dans iOS

J'ai vu des questions similaires, mais n'ont pas trouvé de réponses viables.

Je souhaite masquer un UIView en utilisant une image grise (besoin de convertir en échelle alpha pour masquer). L'UIView a de l'arrière-plan. Il devrait être facile de masquer une image, mais je veux masquer n'importe quel UIView.

Tous les indices seront appréciés.

30
subchap

Je travaille sur ce problème pendant quelques heures et j'ai une solution que je pense fera ce que vous voulez. Tout d'abord, créez votre image de masquage en utilisant tout ce qui signifie que vous voyez en forme. Notez que nous n'avons besoin que des valeurs alpha ici, toutes les autres couleurs seront ignorées, assurez-vous donc que la méthode que vous utilisez prend en charge les valeurs alpha. Dans cet exemple je suis en train de charger à partir d'un fichier .png, mais n'essayez pas avec des fichiers .jpg car ils ne disposent pas de valeurs alpha.

Ensuite, créez un nouveau calque, attribuez votre masque à son contenu et définissez ce nouveau calque sur votre propre calque UIVIEW, comme vous devez donc constater que cela masque l'UIView et toutes ses sous-états ci-joints:

UIImage *_maskingImage = [UIImage imageNamed:@"mask"];
CALayer *_maskingLayer = [CALayer layer];
_maskingLayer.frame = theView.bounds;
[_maskingLayer setContents:(id)[_maskingImage CGImage]];
[theView.layer setMask:_maskingLayer];

Avec cela, vous pouvez définir la couleur d'arrière-plan UIVIEW dans ce que vous aimez et que le masque sera utilisé pour créer un filtre coloré.

EDIT : à partir de iOS8, vous pouvez maintenant masquer une vue simplement en attribuant une autre vue à sa propriété MaskView. Les règles générales restent les mêmes en ce que la couche alpha de MaskView's alpha est utilisée pour déterminer l'opacité de la vue appliquée.

68
Ash

Pour les applications ciblant IOS 8.0+, cela a bien fonctionné (dans ce cas, en utilisant un gradient comme masque), il évite de redimensionner ou de positionner le masque.

// Add gradient mask to view
func AddGradientMask(targetView: UIView)
{
    let gradientMask = CAGradientLayer()

    gradientMask.frame = targetView.bounds
    gradientMask.colors = [UIColor.blackColor().CGColor, UIColor.clearColor().CGColor]
    gradientMask.locations = [0.8, 1.0]

    let maskView: UIView = UIView()
    maskView.layer.addSublayer(gradientMask)

    targetView.maskView = maskView 
}

Dans mon cas, je veux retirer le masque une fois que l'utilisateur commence à défiler. Ceci est fait avec:

func scrollViewWillBeginDragging(scrollView: UIScrollView) {

    exerDetailsTableView.maskView = nil        
}

où la vue est définie comme une @iboutlet:

@IBOutlet weak var exerDetailsTableView: UITableView!

Résultat:

example screenshot

9
Stonetip