2015-01-02 9 views
27

Ho uno CGRect e mi piacerebbe regolarlo con uno UIEdgeInsets.Posso regolare un CGRect con un UIEdgeInsets?

Sembra che forse potrebbe esserci una funzione incorporata in questo. Ho cercato uno CGRectAdjustByInsets o funzioni con qualche altro prefisso CGRect…, ma non ho trovato nulla.

Devo programmare il mio?

risposta

66

TL; DR

Utilizzare la funzione UIEdgeInsetsInsetRect(theRect, theInsets).

Esempio

// 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}} 

Spiegazione

  • Un inserto positivo sposta il bordo del rettangolo verso l'interno (verso la metà rettangolo).
  • Un riquadro negativo sposta il bordo verso l'esterno (lontano dal centro del rettangolo).
  • Un inserto zero lascerà il bordo da solo.

Tell Me More

Altre funzioni utili per operare su CGRect s sono coperti da this note.

+1

Fantastico! Avrei dovuto aspettarmi che questo metodo esistesse, ma sono grato che non ho dovuto cercarlo a fondo! ;-) – mbm29414

3

Swift3

dici che vuoi i limiti, ma meno due pixel sul fondo:

let ei = UIEdgeInsetsMake(0, 0, 2, 0) // TLBR 
    let smaller = UIEdgeInsetsInsetRect(bounds, ei) 

Questo è tutto.

Se si preferisce scriverlo come una linea, è solo

Prendere due dal fondo:

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

Acclamazioni

+1

È strano che Swift 3 non lo includesse come funzione su 'CGRect':' rect.insetBy (edgeInset) 'o qualcosa del genere. – LucasTizma

+0

No, voglio dire, la sintassi. Piuttosto che essere una funzione prolissa, potrebbe semplicemente operare direttamente su un 'CGRect'. – LucasTizma

+0

Sono consapevole. Ma potrebbe essere. Proprio come tutte le altre funzioni di CGRect. – LucasTizma

Problemi correlati