UIButton non andrà ad Aspect Fit in iPhone



9 Answers

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à).

Question

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.




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).




Se metti l'immagine in UIImageView dietro il pulsante, perderai la funzionalità built-in della classe UIButton , come adjustsImageWhenHighlighted e adjustsImageWhenDisabled , e ovviamente la possibilità di impostare immagini diverse per stati diversi (senza la punta del fare questo te stesso).

Se vogliamo avere un'immagine non strutturata per tutti gli stati di controllo , è sufficiente ottenere l'immagine usando imageWithCGImage:scale:orientation , come nel seguente metodo:

- (UIImage *) getScaledImage:(UIImage *)img insideButton:(UIButton *)btn {

    // Check which dimension (width or height) to pay respect to and
    // calculate the scale factor
    CGFloat imgRatio = img.size.width / img.size.height, 
            btnRatio = btn.frame.size.width / btn.frame.size.height,
            scaleFactor = (imgRatio > btnRatio 
                           ? img.size.width / btn.frame.size.width
                           : img.size.height / btn.frame.size.height;

    // Create image using scale factor
    UIImage *scaledImg = [UIImage imageWithCGImage:[img CGImage]
                                             scale:scaleFactor
                                       orientation:UIImageOrientationUp];
    return scaledImg;
}

Per implementarlo scriveremmo:

UIImage *scaledImg = [self getScaledImage:myBtnImg insideButton:myBtn];
[myBtn setImage:scaledImg forState:UIControlStateNormal];

Ciò dovrebbe impedire all'immagine di espandersi in tutti gli stati di controllo. Ha funzionato per me, ma fammi sapere se non funziona!

NOTA: Qui stiamo affrontando un problema relativo a UIButton , ma insideButton: potrebbe anche essere all'interno insideView: o qualunque cosa si voglia inserire nell'immagine.




Questo ha funzionato per me

[button.imageView setContentMode:UIViewContentModeScaleAspectFit];

Grazie a @ayreguitar per il suo commento




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



btn.imageView.contentMode = UIViewContentModeScaleAspectFit;



Le modalità di contenuto di UIView si applicano al "contenuto" del CALayer corrispondente. Questo funziona per UIImageView s perché impostano il contenuto CALayer sul CGImage corrispondente.

drawRect: rendering al contenuto del livello.

Un UIButton personalizzato (per quanto ne so) non ha contenuto (i pulsanti stile arrotondato-rect potrebbero essere resi utilizzando il contenuto). Il pulsante ha subviews: lo sfondo UIImageView , l'immagine UIImageView e il titolo UILabel . L'impostazione di contentMode nelle sottoview può fare ciò che vuoi, ma fare confusione con la gerarchia delle viste di UIButton è un po 'no-no.




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

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




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



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:




Related