390 Stimmen

Wie fügt man mehrzeiligen Text zu einer UIButton hinzu?

Ich habe den folgenden Code...

UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @"Long text string";
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];

...die Idee ist, dass ich mehrzeiligen Text für die Schaltfläche haben kann, aber der Text ist immer durch das backgroundImage der UIButton verdeckt. Ein Logging-Aufruf, um die Unteransichten der Schaltfläche anzuzeigen, zeigt, dass das UILabel hinzugefügt wurde, aber der Text selbst ist nicht zu sehen. Ist dies ein Fehler in UIButton oder mache ich etwas falsch?

3voto

jpedroso Punkte 589

Was Brents Idee betrifft, den Titel UILabel als Geschwisteransicht zu verwenden, so scheint mir das keine sehr gute Idee zu sein. Ich denke immer in Interaktion Probleme mit dem UILabel aufgrund seiner Touch-Ereignisse nicht immer durch die UIButton-Ansicht.

Auf der anderen Seite, mit einem UILabel als Unteransicht des UIButton, bin ich ziemlich beruhigt zu wissen, dass die Touch-Ereignisse immer an die UILabel's superview propagiert werden.

Ich habe diesen Ansatz gewählt und habe keines der Probleme bemerkt, die mit backgroundImage gemeldet wurden. Ich habe diesen Code in die -titleRectForContentRect: einer UIButton-Unterklasse eingefügt, aber der Code kann auch in der Zeichenroutine der UIButton-Superview platziert werden, wobei in diesem Fall alle Referenzen auf self durch die UIButton-Variable ersetzt werden müssen.

#define TITLE_LABEL_TAG 1234

- (CGRect)titleRectForContentRect:(CGRect)rect
{   
    // define the desired title inset margins based on the whole rect and its padding
    UIEdgeInsets padding = [self titleEdgeInsets];
    CGRect titleRect = CGRectMake(rect.origin.x    + padding.left, 
                                  rect.origin.x    + padding.top, 
                                  rect.size.width  - (padding.right + padding.left), 
                                  rect.size.height - (padding.bottom + padding].top));

    // save the current title view appearance
    NSString *title = [self currentTitle];
    UIColor  *titleColor = [self currentTitleColor];
    UIColor  *titleShadowColor = [self currentTitleShadowColor];

    // we only want to add our custom label once; only 1st pass shall return nil
    UILabel  *titleLabel = (UILabel*)[self viewWithTag:TITLE_LABEL_TAG];

    if (!titleLabel) 
    {
        // no custom label found (1st pass), we will be creating & adding it as subview
        titleLabel = [[UILabel alloc] initWithFrame:titleRect];
        [titleLabel setTag:TITLE_LABEL_TAG];

        // make it multi-line
        [titleLabel setNumberOfLines:0];
        [titleLabel setLineBreakMode:UILineBreakModeWordWrap];

        // title appearance setup; be at will to modify
        [titleLabel setBackgroundColor:[UIColor clearColor]];
        [titleLabel setFont:[self font]];
        [titleLabel setShadowOffset:CGSizeMake(0, 1)];
        [titleLabel setTextAlignment:UITextAlignmentCenter];

        [self addSubview:titleLabel];
        [titleLabel release];
    }

    // finally, put our label in original title view's state
    [titleLabel setText:title];
    [titleLabel setTextColor:titleColor];
    [titleLabel setShadowColor:titleShadowColor];

    // and return empty rect so that the original title view is hidden
    return CGRectZero;
}

Ich habe mir die Zeit genommen und ein wenig mehr darüber geschrieben aquí . Dort weise ich auch auf eine kürzere Lösung hin, die allerdings nicht ganz für alle Szenarien geeignet ist und das Hacken einiger privater Ansichten beinhaltet. Auch dort können Sie eine UIButton-Subklasse bereit, verwendet werden herunterladen.

2voto

makiko_fly Punkte 451

Es funktioniert perfekt.

Um dies mit einer Konfigurationsdatei wie Plist zu verwenden, müssen Sie CDATA verwenden, um den mehrzeiligen Titel zu schreiben, etwa so:

<string><![CDATA[Line1
Line2]]></string>

2voto

Sourabh Sharma Punkte 7762

Wenn Sie Auto-Layout verwenden.

button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.numberOfLines = 2

2voto

ingconti Punkte 9854

Mauersegler 4.0

btn.titleLabel?.lineBreakMode = .byWordWrapping
btn.titleLabel?.textAlignment = .center
btn.setTitle( "Line1\nLine2", for: .normal)

1voto

pkamb Punkte 30154

In iOS 15 im Jahr 2021 unterstützt Apple zum ersten Mal offiziell mehrzeilige UIButtons über die UIButton.Konfiguration API.

UIButton.Konfiguration

Eine Konfiguration, die das Aussehen und Verhalten einer Schaltfläche und ihres Inhalts festlegt.

UIButton.Configuration

Diese neue API wird untersucht in Was ist neu in UIKit als auch die Sitzung:

Lernen Sie das UIKit-Schaltflächensystem kennen

Jede Anwendung verwendet Schaltflächen. Mit iOS 15 können Sie aktualisierte Stile übernehmen, um wunderschöne Schaltflächen zu erstellen, die sich mühelos in Ihre Oberfläche einfügen. Wir lernen Funktionen kennen, die das Erstellen verschiedener Schaltflächentypen vereinfachen, erfahren, wie Sie reichhaltigere Interaktionen bereitstellen können, und entdecken, wie Sie mit Mac Catalyst großartige Schaltflächen erstellen können.

https://developer.apple.com/videos/play/wwdc2021/10064/

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