web-dev-qa-db-fra.com

Puis-je ajuster un CGRect avec un UIEdgeInsets?

J'ai un CGRect, et je voudrais l'ajuster avec un UIEdgeInsets.

Il semble qu'il y ait peut-être une fonction intégrée qui le fasse. J'ai cherché un CGRectAdjustByInsets ou des fonctions avec un autre CGRect… préfixe, mais je n'ai rien trouvé.

Dois-je coder le mien?

41
Benjohn

TL; DR

Swift 4.2 utilisez theRect.inset(by: theInsets) .

Objectif C utiliser UIEdgeInsetsInsetRect(theRect, theInsets)

Exemple

// CGRectMake takes: left, bottom, width, height.
const CGRect originalRect = CGRectMake(0, 0, 100, 50);

// UIEdgeInsetsMake takes: top, left, bottom, right.
const UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, -20, -20);

// Apply the insets…
const CGRect adjustedRect = UIEdgeInsetsInsetRect(originalRect, insets);

// What's the result?
NSLog(@"%@ inset by %@ is %@", 
      NSStringFromCGRect(originalRect),
      NSStringFromUIEdgeInsets(insets),
      NSStringFromCGRect(adjustedRect));

// Logs out…
// {{0, 0}, {100, 50}} inset by {10, 10, -20, -20} is {{10, 10}, {110, 60}}

Explication

  • Un encart positif déplace le bord du rectangle vers l'intérieur (vers le milieu du rectangle).
  • Un encart négatif déplace le bord vers l'extérieur (loin du milieu du rectangle).
  • Un insert zéro laisse le Edge seul.

Dis m'en plus

D'autres fonctions utiles pour opérer sur CGRects sont couvertes par cette note .

89
Benjohn

2018 ... Swift4

Dis que tu veux les limites,

mais par exemple moins deux pixels sur le en bas:

let ei = UIEdgeInsetsMake(0, 0, 2, 0)   // top-left-bottom-right
let smaller = UIEdgeInsetsInsetRect(bounds, ei)

C'est ça.

Si vous préférez écrivez-le sur une seule ligne, c'est juste

Enlevez deux du fond:

let newBounds = UIEdgeInsetsInsetRect(bounds, UIEdgeInsetsMake(0, 0, 2, 0))

À votre santé

8
Fattie

Encore 2018 ... Swift 4.2

Je suppose que la nouvelle façon semble meilleure ...

let newCGRect = oldCGRect.inset(by: UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 8))
7
bearacuda13