15 Stimmen

Wenn der UIButton-Inhaltsmodus "center" ist, ist das Hintergrundbild verpixelt

So stelle ich das Hintergrundbild und den Inhaltsmodus ein:

[btn setBackgroundImage:[UIImage imageNamed:@"dots_game_horiz_blue.png"] 
               forState:UIControlStateNormal];
[btn setContentMode:UIViewContentModeCenter];

Gibt es einen Grund dafür, dass das Hintergrundbild verpixelt sein könnte? Der Rahmen ist etwas größer als die Bildgröße, und ich möchte nur, dass das Bild zentriert wird.

1 Stimmen

Tut mir leid, dass ich das aus den Tiefen der Zeit hervorhole, aber wenn ich mich nicht irre, gibt es dort ein Speicherleck. Keine Freigabe für die Zuweisung.

0 Stimmen

@Joseph, vielen Dank für diesen Hinweis. Ich habe den Code aktualisiert.

24voto

James Skidmore Punkte 46884

Ich schätze, ein Hintergrundbild wird von der UIButton nicht als "Inhalt" betrachtet, so dass der Inhaltsmodus nicht auf das Hintergrundbild angewendet wurde. Stattdessen setzte ich das Bild der Schaltfläche und es funktionierte gut:

[btn setImage:[[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"dots_game_horiz_blue" ofType:@"png"]] forState:UIControlStateNormal];
[btn setContentMode:UIViewContentModeCenter];

2 Stimmen

Das Problem bei dieser Lösung ist, dass der UIButton einen internen Rand hat. Wenn das Bild also nicht klein genug ist, wird es abgeschnitten, auch wenn es in den Button passen sollte.

3 Stimmen

Die Einstellung des Inhaltsmodus bewirkt hier eigentlich nichts. Schaltflächenbilder werden automatisch zentriert und nicht skaliert. Versuchen Sie, ihn auf etwas anderes als zentriert einzustellen und sehen Sie, was ich meine.

2 Stimmen

+1 Wenn Sie jedoch sowohl Text als auch ein Bild haben möchten, funktioniert das leider nicht :-(

10voto

Rémi Belzanti Punkte 413

In Ihrer xib / Storyboard, in der Attribute-Inspektor, müssen Sie zu:

  1. Stellen Sie Ihr UIButton Typ zu Custom
  2. Stellen Sie Ihr Bild in der Eigenschaft Image , nicht Background
  3. Wenn Sie Schritt 2 bestätigen, können Sie sehen, dass sich der Rahmen der Schaltfläche entsprechend dem eingestellten Bild ändert. Stellen Sie den Rahmen so ein, wie Sie ihn haben möchten, und das Bild passt sich an
  4. Wählen Sie Image für die Immobilie Edge um die Einfügung auf das Schaltflächenbild anzuwenden
  5. Geben Sie die benötigten Einsetzwerte ein. Wenn Sie 5 auf Top, Bottom, Left, Right wird das Bild innerhalb der Schaltfläche zentriert, mit einem Rand von 5

Sie können die Änderungen in der xib-/Storyboard-Ansicht sehen, ohne ein Debugging starten zu müssen.

Tipp: Die Einfügung ist für alle Bilder der Schaltfläche gleich ( State Config )

1 Stimmen

Alles, was mit In your xib / storyboard ist keine Lösung für diese Frage :D

0 Stimmen

Inzwischen hat sich die Lösung entwickelt. Sie können den Schritt 4 überspringen und mit Schritt 5 über den Größeninspektor (Regelsymbol) fortfahren.

5voto

Dan Grover Punkte 196

Sie könnten auch Folgendes implementieren - (CGRect)backgroundRectForBounds:(CGRect)bounds um zu steuern, wie der Hintergrund gezeichnet wird.

3 Stimmen

Das hat bei mir funktioniert. Ich mache eine benutzerdefinierte UIButton-Klasse, und ich habe diesen Code verwendet, um das Bild zu zentrieren: - (CGRect)backgroundRectForBounds:(CGRect)bounds { UIImage *bkgImage = [self backgroundImageForState:self.state]; if (bkgImage) { CGFloat x = floorf((self.bounds.size.width-bkgImage.size.width)/2); CGFloat y = floorf((self.bounds.size.height-bkgImage.size.height)/2); return CGRectMake(x, y, bkgImage.size.width, bkgImage.size.height); } else return [super backgroundRectForBounds:bounds]; }

0 Stimmen

"Overkill"-Lösung imo. Sie können einfach Rahmen für die Schaltfläche wie setzen: UIImage* img = [UIImage imageNamed:@"dots_game_horiz_blue.png"]; [btn setBackgroundImage:img forState:UIControlStateNormal]; btn.frame = CGRectMake(0, 0, img.size.width, img.size.height);

1voto

emkman Punkte 792

Die richtige Lösung besteht darin, den Typ von System in Benutzerdefiniert zu ändern. Dann wird das Hintergrundbild den Inhaltstyp berücksichtigen und nicht nur zentrieren. In meinem Fall habe ich es auf Aspect Fill gesetzt und einen 45-Grad-Eckenradius angewendet, um es abzurunden. Das ist einfach und funktioniert perfekt.

0 Stimmen

Das klappt nicht. Ich habe eine neue benutzerdefinierte Schaltfläche erstellt und ihren Inhaltsmodus auf "Zentrieren" gesetzt, aber sie füllt das Hintergrundbild immer noch auf die Größe der Ansicht aus.

0voto

Brennan Punkte 11286

Ich musste runde Schaltflächen für Avatar-Fotos erstellen und fand die Antworten auf diese Frage hilfreich, aber sie brachten mich nicht ganz ans Ziel. Ich implementierte die backgroundRectForBounds Methode und skalierte das Bild, um es anzupassen, und es funktioniert gut.

Ich habe den Code auf GitHub.

https://github.com/brennanMKE/CircleButton

Die Methode ist ebenfalls unten aufgeführt. Es ist wichtig, das Hintergrundbild einzustellen und nicht das Bild für die Schaltfläche, die mit dieser Methode nicht funktioniert.

- (CGRect)backgroundRectForBounds:(CGRect)bounds {
    UIImage *backgroundImage = [self backgroundImageForState:self.state];
    if (backgroundImage) {
        CGFloat maxWidth = CGRectGetWidth(self.frame);

        CGFloat xDelta = maxWidth / backgroundImage.size.width;
        CGFloat yDelta = maxWidth / backgroundImage.size.height;
        CGFloat delta = xDelta > yDelta ? xDelta : yDelta;

        CGFloat x = floorf((self.bounds.size.width - (backgroundImage.size.width * delta)) / 2);
        CGFloat y = floorf((self.bounds.size.height - (backgroundImage.size.height * delta)) / 2);

        return CGRectMake(x, y, backgroundImage.size.width * delta, backgroundImage.size.height * delta);
    }
    else {
        return [super backgroundRectForBounds:bounds];
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X