webentwicklung-frage-antwort-db.com.de

OILabel oben ausgerichtet, Text oben auf der Etikettenansicht anbringen -ios

Gibt es eine Möglichkeit, ein UILabel "nach oben auszurichten", d. H., Dass Text am oberen Rand der Etikettenansicht bleibt? Im Gegensatz zu vertikal zentriert oder in der Mitte der Ansicht schweben, wie es der Standard ist?

Hier ist ein Bild mit drei Beschriftungen, links, rechts und mittig ausgerichtet, und einer UITextView, die in der Mitte und oben ausgerichtet ist. Der Text der Textansicht bleibt unabhängig von der vertikalen Größe der Ansicht an der Spitze. Kann ich dasselbe mit einem Label machen?

enter image description here

25
Mrwolfy

Es ist nicht möglich, die vertikale Ausrichtung einer UILabel in iOS standardmäßig festzulegen. Verwenden Sie stattdessen eine der von sizeWithFont bereitgestellten NSString-Methoden. Welche Sie verwenden, hängt davon ab, ob Sie ein mehrzeiliges oder einzeiliges Etikett wünschen. sizeWithFont:forWidth:lineBreakMode: kann für einzeilige Beschriftungen verwendet werden, während sizeWithFont:constrainedToSize:lineBreakMode: für mehrzeilige Beschriftungen verwendet werden kann. Sie können den font-Parameter problemlos mit der font-Eigenschaft des betreffenden Labels laden. Sie können here nach weiteren Details zur Verwendung dieser Funktionen suchen.

Diese Methoden geben eine CGSize-Struktur mit der Mindestgröße für Ihr Label basierend auf dem Text in der NSString zurück. Wenn Sie die richtige Größe für das Etikett festgelegt haben, können Sie es ganz einfach oben in Ihrem Übersichtsfenster platzieren, und es erscheint als nach oben ausgerichtet.

9
Paul O.

Es gibt eine Problemumgehung dafür:

  1. Stellen Sie eine Höhe und Breite constraint auf Ihre UILabel mit einer Konstanten <= auf die maximale Breite ein, die Sie wünschen.
  2. Setzen Sie number of lines auf Null.
  3. Stellen Sie die Höhe in storyboard so ein, dass sie nur in eine Zeile passt.
  4. In Ihrem Code nach dem Setzen des Textes von UILabel rufen Sie sizeToFit auf.

Dadurch würde sich Ihre UILabel innerhalb der Grenzen der gewünschten maximalen Breite und Höhe ändern, und der Text wird immer oben ausgerichtet.

26
AboulEinein

Ich habe die Antwort aus nevan king in einem Kommentar zu meiner Frage verwendet: Text vertikal an einem UILabel nach oben ausrichten

Der Code, den ich verwendet habe, ist hier:

- (void)setUILabelTextWithVerticalAlignTop:(NSString *)theText {
    CGSize labelSize = CGSizeMake(250, 300);
    CGSize theStringSize = [theText sizeWithFont:targetLabel.font constrainedToSize:labelSize lineBreakMode:targetLabel.lineBreakMode];
    targetLabel.frame = CGRectMake(targetLabel.frame.Origin.x, targetLabel.frame.Origin.y, theStringSize.width, theStringSize.height);
    targetLabel.text = theText;
}

//linked to a button that sets the text from a UITextView to the label.
- (IBAction)setText:(id)sender {

    [sourceText resignFirstResponder];
    [self setUILabelTextWithVerticalAlignTop:sourceText.text];
    [targetLabel setNumberOfLines:0];
    [targetLabel sizeToFit];

}

Hier ist das Projekt:

owolf.net/uploads/StackOverflow/verticalAlignUILabel.Zip

12
Mrwolfy

Ich habe UILabel durch UITextView ersetzt, da der Text in UITextView an der Spitze bleibt.

Nur ein Vorschlag, es kann für jemanden nützlich sein. 

6
WebOrCode

Erstellen Sie eine Unterklasse von UILabel 

.h Datei

@property (nonatomic, assign) UIControlContentVerticalAlignment verticalAlignment;

.m Datei

- (void) drawTextInRect:(CGRect)rect 
{
    if(_verticalAlignment == UIControlContentVerticalAlignmentTop ||  _verticalAlignment == UIControlContentVerticalAlignmentBottom)    
    {
         // If one line, we can just use the lineHeight, faster than querying sizeThatFits
         const CGFloat height = floorf(((self.numberOfLines == 1) ? ceilf(self.font.lineHeight) : [self sizeThatFits:self.frame.size].height));
          rect.Origin.y = floorf(((self.frame.size.height - height) / 2.0f) * ((_verticalAlignment == UIControlContentVerticalAlignmentTop) ? -1.0f : 1.0f));
    }
    [super drawTextInRect:rect];
}


- (void) setVerticalAlignment:(UIControlContentVerticalAlignment)newVerticalAlignment
{
     _verticalAlignment = newVerticalAlignment;
     [self setNeedsDisplay];
}

Ich habe dies für die vertikale Ausrichtung verwendet. 

1
Wodjefer

Es gibt eine einfache Lösung für Fälle, in denen die Höhe eines Etiketts nicht konstant sein muss: Geben Sie Ihre Label in einen Stack View ein. Stellen Sie sicher, dass Sie dem Stack View..__ führende und nachfolgende Konstanten hinzufügen. Hier ist ein Screenshot, wie Sie dies im Storyboard tun:

 enter image description here

1

Was ich in meiner App getan habe, war, die Line-Eigenschaft des UILabels auf 0 zu setzen und eine untere Einschränkung der UILabel zu erstellen und sicherzustellen, dass sie auf> = 0 gesetzt wird (siehe Abbildung unten).

 enter image description here

0
Jack