2010-05-27 9 views
9
UIImage *aImage = [[UIImage imageNamed:@"Gray_Button.png"] stretchableImageWithLeftCapWidth:25 topCapHeight:0]; 

Cercando di fare un "pulsante pillola di vetro".iPhone stretchableImageWithLeftCapWidth rende solo "D" s

Cosa fa "allungare" se l'immagine è più grande ... e il pulsante su cui sto provando ad usarlo ... è più piccolo?

L'immagine 'allunga' e 'si restringe'?

Il motivo per cui lo chiedo ... è perché tutte le mie immagini finiscono per assomigliare a una "D".

Il lato sinistro è squadrato-off ... e il lato destro è arrotondato.

Cosa direbbe una forma a D che sto sbagliando? Troppo .. o troppo poco ... "leftCap setting"? Un'immagine troppo grande?

risposta

54

Un'immagine estensibile è divisa in 9 parti, se entrambe le cifre leftCapWidth e sono diverse da zero.

 leftCapWidth 
     <-----> 
     +--------------+^
     |  | |  | | 
     | A | | B | | topCapHeight 
     |-----+·+------| v 
     |-----+·+------| 
     | C | | D | 
     |  | |  | 
     +--------------+ 

Le parti centrali sono sempre 1 px in termini di dimensioni, e questa è la parte che è allungata, per esempio:

 leftCapWidth (constant!) 
     <-----> 
     +------------------+^
     |  |  |  | | 
     | A |  | B | | topCapHeight (constant!) 
    v |-----+ - - +------| v 
    | |  .  .  | 
    | |  .  .  | 
    ^|-----+ - - +------| 
     | C |  | D | 
     |  |  |  | 
     +------------------+ 
      >-----< 
     stretched region 

di creare un "pulsante di vetro pillola", si dovrebbe riempire il arrotondata confine con le regioni A, B, C e D sopra, e fornire il raggio di quella pillola in entrambi i leftCapWidth e .


Inoltre, un'immagine estensibile è non termoretraibile. Se si tenta di utilizzare immagini estensibili più grandi dei pulsanti (o di qualsiasi altra cosa) a cui si desidera applicare, potrebbero essere visualizzate in modo errato (specialmente su iOS meno recenti).

+0

Quindi un valore pari a 0 significherebbe "non allungare nulla" o "allungare uniformemente su tutta l'immagine"? Non riesco a vedere nulla che possa causare un problema a "D". Immagino che la prima cosa che dovrei fare sia assicurarsi che OGNI immagine sia più piccola di OGNI pulsante. (Se no ... allora cosa succede?L'immagine è appena stata usata "così com'è"? E cosa ne sarà delle distorsioni di valore limite che non si verificheranno?) – Susanna

+0

@Roberta: 0 significa "allunga uniformemente sull'intera immagine". Se l'immagine è più piccola degli angoli si sovrappongono l'una con l'altra. – kennytm

+1

L'illustrazione è davvero utile. – nonamelive

3

stretchableImageWithLeftCapWidth non si comporta come ci si aspetterebbe. Suggerisco di usare la proprietà contentStretch di UIView per risparmiare un po 'di frustrazione.

Cordiali saluti, il modo in cui si comporta stretchableImage è:

  • se ridurre l'immagine, è solo clip le parti superiore e sinistro dell'immagine, piuttosto che di stretching nulla.
  • se si espande l'immagine, si espanderà solo la colonna di pixel appena sotto il tappo superiore e la riga di pixel appena a destra del cap sinistro. Questo funziona per una grafica molto semplice, ma sembrerà scomodo per qualsiasi grafica che abbia effetti come l'ombreggiatura o la lucentezza.

contentStretch, d'altra parte, si comporta come ci si aspetterebbe. Il grafico viene fondamentalmente diviso in 9 parti che espandono e CONTRASSANO come spiegato da Kenny.

Inoltre, non dimenticare che ogni volta che si allunga una vista, il suo contentMode deve essere impostato su UIViewContentModeScaleToFill.

+0

Questo non è vero. Come spiegato da @KennyTM, non CONTRATTANO in questo modo: i cappucci non sono rispettati se l'immagine deve essere ridotta. –