2010-01-03 9 views
8

Sto tentando di creare un pulsante personalizzato utilizzando un'immagine di sfondo in Interface Builder. L'immagine ha parti estensibili e non estensibili in modo che possano essere ridimensionate.Interface Builder (iPhone dev) sfondo del pulsante personalizzato L'immagine non rispetta Impostazioni di stretching

IB espone le proprietà di Allargamento per tener conto di ciò, ma nessun valore inserito influenza il modo in cui appare il pulsante. È sempre completamente allungato per riempire la dimensione della cornice.

Si tratta forse di una funzione non supportata in IB o UIButton?

http://img.skitch.com/20100103-rjabkq2c2jkqynw47crxepdtwb.jpg

(Nota: I valori stirata sopra non sono quelli che funzionano con l'immagine correttamente, ma solo i valori sono stato scherzi con all'atto della figura)

+0

Stesso problema con gli stessi file di esempio di UICatalog. Qualche progresso? Hai dovuto configurarlo in codice? – JOM

risposta

2

Nell'esempio in Beginning iPhone 3 Development solo il UIImage leftCapWidth e topCapHeight vengono utilizzati, e viene creato l'immagine/set a livello di codice, in modo che un metodo alternativo se contentStretch non funziona.

+0

Sembra che questo non funzioni come potrebbe sembrare. I documenti parlano di questi valori facendo esattamente quello che voglio (l'intera immagine di stretching del pulsante). Avere programmaticamente l'aspetto del pulsante corretto è un po 'strano dato che abbiamo un'intera interfaccia grafica che rende la GUI ... alias IB. –

+0

Guardando i documenti per contentStretch, i valori predefiniti che IB mostra (in particolare gli 0.50) non sono i valori predefiniti effettivi di h/w 0,0 e dimensione 1,1 quindi immagino che non sia troppo sorprendente che le impostazioni in IB don lavorare Sembra che contentStretch sia stato aggiunto in 3.0, quindi probabilmente ha qualcosa a che fare con esso. http://bugreport.apple.com/ – Nimrod

+1

Non seguo. Non sto usando le impostazioni predefinite. Come ho detto, nessun valore che ho inserito ha alcun impatto. Quelli mostrati nella schermata non sono quelli predefiniti. Stavo correndo sotto 3.0. –

0

Nei casi in cui si desidera allungare più di un pixel (ad esempio un motivo al centro del pulsante) l'UIImage elastico non funziona.

Anche il contentStretch di UIButton non funziona correttamente.

Come ho risolto: ho sottoclasse UIButton e aggiunto un UIImageView *backgroundImageView come proprietà e l'ho inserito all'indice 0 come sottoview all'interno dello UIButton. Quindi, assicuro nel layout di visualizzazione che si adatti perfettamente al pulsante e imposta gli stati evidenziati di imageView. Tutto ciò che devi fare è passare una UIImageView con il contentStretch e ContentMode corretti.

file h

@interface ButtonWithBackgroundImage : UIButton { 
    UIImageView *backgroundImageView; 
} 
@property (retain) UIImageView *backgroundImageView; 
+ (ButtonWithBackgroundImage*)button; 
@end 

di file .m

@implementation ButtonWithBackgroundImage 
@synthesize backgroundImageView; 

+ (ButtonWithBackgroundImage*)button { 
return [self buttonWithType:UIButtonTypeCustom]; 
} 
- (void)setBackgroundImageView:(UIImageView*)img { 
    [backgroundImageView removeFromSuperview]; 
    [backgroundImageView release]; 

    backgroundImageView = [img retain]; 

    if(backgroundImageView){ 
     [self insertSubview:backgroundImageView atIndex:0]; 
     [self setNeedsLayout]; 
    } 
} 

- (void)setSelected:(BOOL)select { 
    [super setSelected:select]; 
    // we subclass the setSelect method to highlight the background imageview 
[backgroundImageView setHighlighted:select||self.highlighted]; 
} 
- (void)setHighlighted:(BOOL)highl { 
    [super setHighlighted:highl]; 

    // we subclass the setHighlighted method to highlight the background imageview  
    [backgroundImageView setHighlighted:highl||self.selected]; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    self.backgroundImageView.frame = self.bounds; 
} 

- (void)dealloc { 
    [backgroundImageView release]; 
    backgroundImageView = nil; 
    [super dealloc]; 
} 
@end 
+0

ora supporta le immagini affiancate .. – hfossli

-1

ho ottenuto che funziona !!! I valori magici per me sono 0.2 e 0.2.

La mia immagine è una scatola all'interno di una scatola, entrambe con angoli arrotondati.

Quando è 0.2 e 0.8, lascia la parte superiore dell'immagine non stirata, ma il fondo è allungato e distorto.

Immagino che il primo 0.2 sia l'offset che significa quanto non allungare, e il 2 ° è probabilmente quanto allungare. Almeno, anche lo 0,2 e lo 0,6.

In linea di principio, è possibile effettuare un esperimento: scattare un'immagine di un reticolo o di cerchi concentrici o di un gradiente di colore e allungarla. Se lo fai, per favore pubblica l'immagine :).

0

L'immagine di sfondo del pulsante verrà sempre ridimensionata per riempire il riquadro; l'immagine in primo piano non verrà ridimensionata (se non c'è testo, è centrata). La logica dello stretching è che ridimensiona il centro lasciando intatti i bordi; ad esempio, per un rettangolo arrotondato ciò significa che gli angoli arrotondati non saranno distorti.

0

Utilizzare la funzione Xcode Slicing per specificare le dimensioni di un'area centrale ridimensionabile dell'immagine e per specificare opzionalmente i capolettera, che sono aree dell'immagine che non devono essere riempite dall'area ridimensionabile. Vedere About Asset Catalogs

Problemi correlati