Comment fonctionne clipsToBounds?

110

Je voudrais savoir comment utiliser la UIViewpropriété clipsToBounds.

La documentation officielle dit ce qui suit:

clipsToBounds propriété

Valeur booléenne qui détermine si les sous-vues sont confinées aux limites de la vue.

Discussion Si vous définissez
cette valeur sur YES, les sous-vues sont coupées aux limites du récepteur. Si cette NOoption est définie sur , les sous-vues dont les trames s'étendent au-delà des limites visibles du récepteur ne sont pas écrêtées. La valeur par défaut est NO.

Mais je ne sais pas ce que cela signifie exactement. Comment dois-je utiliser clipsToBounds? Quelles sont les conséquences de la définition YESexacte de cette propriété ? Ou à NO?

Toshi
la source

Réponses:

283

Si mon superview est une boîte mesurant 10 unités de chaque côté et que ma sous-vue a une largeur de 20 unités, avec clipsToBoundsdéfini sur YES, je ne verrai que la partie de la sous-vue qui s'inscrit dans les limites de la supervision. Sinon, si clipsToBoundsest défini sur NO, je verrai la sous-vue entière, même les parties en dehors de la supervision (en supposant que nous soyons toujours à l'écran).

À titre d'exemple visuel, considérez les vues suivantes configurées sur le storyboard:

entrez la description de l'image ici

Ceci est un blanc UIView, une étiquette dans le coin supérieur gauche avec un simple "1" ou "2" afin que je puisse en discuter comme view1ou view2. De plus, la vue noire est de la même taille que la vue blanche, mais son origine se trouve au centre de la vue blanche.

Dans la viewDidLoadméthode du contrôleur de vue , nous avons le code suivant:

Objectif c:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view1.clipsToBounds = YES;
    self.view2.clipsToBounds = NO;
}

Rapide:

override func viewDidLoad() {
    super.viewDidLoad()
    self.view1.clipsToBounds = true
    self.view2.clipsToBounds = false
}

Lorsque nous exécutons le code et regardons dans le simulateur ou sur l'appareil, nous obtenons les résultats suivants:

entrez la description de l'image ici

Ainsi, bien que ces vues soient configurées de manière identique (sauf clipsToBounds), elles semblent différentes. C'est ce que clipsToBoundsfait. Le YESdéfinir sur NOfournira le résultat le plus élevé, tandis que le paramètre sur fournira le résultat du bas.

Si nous débogage la hiérarchie des vues, nous pouvons voir plus clairement que les boîtes noires s'étendent toutes les deux au-delà des frontières de la vue blanche, mais seule la vue 2 le montre lorsque l'application est en cours d'exécution:

entrez la description de l'image ici

nhgrif
la source
3
Réponse fantastique! Bien joué. Mais j'ai une question. Pourquoi les UITextViewombres ne sont pas visibles, si la clipsToBoundspropriété est égale à true; ? Si c'est false, fonctionne très bien
Mannopson
1
Remarque: c'est la vue parente sur laquelle vous modifiez clipsToBounds. Donc, si viewB est une sous-vue de viewA. C'est viewA que clipsToBounds doit être rendu vrai.
aestusLabs
Quelle vue à partir du cadre de vue d'origine sur cette vue fonctionne avec le geste de toucher, car je vérifie et cela ne fonctionne pas.
Pravin Tate
2

Ceci est censé être une réponse rapide succincte par rapport à la réponse acceptée

Si Apple a été de renommer cette propriété, je le nomme: clipSubviewsToBounds.

Je viens de rencontrer un bogue dans notre code. Où la hauteur de la vue parent a été définie 0. Nous nous attendions à ne voir aucun de ses éléments. Pourtant, le contenu de la vue parent apparaissait.

C'était parce que ce clipToBoundsn'était pas prévu true. Une fois que cela est défini, trueles hauteurs des sous-vues ne peuvent pas s'étendre au-delà 0, elles ne s'affichent donc pas du tout.

Mon chéri
la source
Cette réponse est bien sous
sasquatch