ios - UIButton non andrà ad Aspect Fit in iPhone




click guideline (18)

Ho un paio di UIButtons, e in IB sono impostati su Aspect Fit, ma per qualche motivo si stanno sempre allungando. C'è qualcos'altro che devi impostare? Ho provato tutte le diverse modalità di visualizzazione e nessuna di esse funziona, tutte si allungano.


Answers

Ho avuto questo problema un po 'di tempo fa. Il problema che avevo era che stavo cercando di applicare questo effetto sullo sfondo UIButton che è limitato e quindi significa che non è possibile regolarlo facilmente.

Il trucco è impostarlo come una semplice immagine, quindi applicare la tecnica di @ ayreguitar e questo dovrebbe risolverlo!

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];

Ho avuto lo stesso problema, ma non ho potuto farlo funzionare (forse è un bug con l'SDK).

Alla fine, come soluzione alternativa, ho posizionato UIImageView dietro il mio pulsante e impostato le opzioni che volevo, quindi ho semplicemente inserito un UIButton vuoto su di esso.


La soluzione è impostare il contentMode sulla proprietà imageView di UIButton . UIButton deve essere creato con un tipo personalizzato affinché funzioni UIButton (altrimenti viene restituito nil per questa proprietà).


Se lo stai facendo in Interface Builder, puoi utilizzare l'ispettore degli attributi di runtime per impostarlo direttamente senza alcun codice.

Imposta il tuo percorso chiave sul pulsante per essere "imageView.contentMode" con un tipo di "Numero" e un valore di "1" (o qualsiasi altra modalità desideri).


Puoi usare imageWithCGImage come mostrato sopra (ma senza le parentesi mancanti).

Inoltre ... milioni di telefoni non 4.0 non funzioneranno affatto con quel codice.


Simile a @Guillaume, ho creato una sottoclasse di UIButton come Swift-File. Quindi imposta la mia classe personalizzata in Interface Builder:

.

E qui il file Swift:

import UIKit

class TRAspectButton : UIButton {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.imageView?.contentMode = .ScaleAspectFit
    }
}

Cambiare UIButton.imageView.contentMode non ha funzionato per me.
Ho risolto il problema impostando l'immagine sulla proprietà 'Background'.
È possibile aggiungere un vincolo di rapporto se necessario


Questo metodo ha funzionato molto bene per me:

In Xib seleziona il pulsante e imposta gli user defined runtime attributes :

  • Percorso chiave: self.imageView.contentMode
  • Tipo: Number
  • Valore: 1

Usiamo il numero perché non puoi usare enum lì. Ma UIViewContentModeScaleAspectFit è uguale a 1.


Questa risposta è basata sulla risposta di @ WernerAltewischer .

Per evitare di connettere il mio pulsante a un IBOutlet per eseguire il codice su di esso, ho suddiviso la classe di UIButton:

// .h
@interface UIButtonWithImageAspectFit : UIButton
@end

// .m
@implementation UIButtonWithImageAspectFit

- (void) awakeFromNib {
    [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}

@end



Ora crea un pulsante personalizzato nel tuo xib e imposta la sua immagine (non l'immagine di sfondo):


Quindi, imposta la sua classe:

Hai finito!
Invece di

l'aspetto dell'immagine del pulsante è ora come previsto:


Usa imageView del pulsante per contentMode. Non direttamente sul pulsante stesso.

homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];

Una soluzione hacky che non ha bisogno di ulteriori visualizzazioni:

Aggiungi la tua immagine di sfondo ed esegui questo codice

 for (UIView * view in self.imageButton.subviews) {
    if ([view isKindOfClass:[UIImageView class]])
    {
        ((UIImageView *)view).contentMode = UIViewContentModeScaleAspectFit;
    }
}

Ho avuto questo problema prima. Ho risolto il problema inserendo la mia immagine in una UIImageView , in cui contentMode impostazioni contentMode funzionano davvero e UIButton un UIButton personalizzato trasparente.

EDIT: questa risposta è obsoleta. Vedi la risposta di @Werner Altewischer per la risposta corretta nelle versioni moderne di iOS.


Combinando insieme diverse risposte in un'unica soluzione: crea un pulsante con un tipo personalizzato, imposta la proprietà imageMode del contenuto dell'immagine del pulsante e imposta l'immagine per il pulsante (non l'immagine di sfondo, che continuerà a ridimensionare per riempire).

//Objective-C:
UIImage *image = [UIImage imageNamed:"myImageName.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

//Swift:
let image = UIImage(named: "myImageName.png")
let button = UIButton(type: .custom)
button.imageView?.contentMode = .scaleAspectFit
button.setImage(image, for: .normal)

Ecco una risposta alternativa in rapida:

myButton.imageView?.contentMode = .ScaleAspectFit

Ho avuto problemi con l'immagine che non ridimensiona proporzionalmente, quindi il modo in cui l'ho risolto era l'utilizzo di margini.

fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);

Ciò si sovrappone a molte delle altre risposte, ma la soluzione per me era di farlo

  • impostare il contentMode di UIImageView per il pulsante su .ScaleAspectFit , che può essere eseguito negli "Attributi di runtime definiti dall'utente" in Interface Builder (ad esempio self.imageView.contentMode , Number, 1) o in una sottoclasse UIButton ;
  • disabilitare "Autoresize Subviews";
  • imposta "Bordo" su "Immagine" e i valori appropriati "Superiore" e "Inferiore" per "Inserto" (che potrebbe essere necessario solo se tu, come me, utilizzi un PDF come immagine).

Questo ha funzionato per me

[button.imageView setContentMode:UIViewContentModeScaleAspectFit];

Grazie a @ayreguitar per il suo commento


ctrl + I formatterà automaticamente il codice che stai selezionando







iphone uibutton