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?
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.
Es gibt eine Problemumgehung dafür:
constraint
auf Ihre UILabel
mit einer Konstanten <= auf die maximale Breite ein, die Sie wünschen.number of lines
auf Null.storyboard
so ein, dass sie nur in eine Zeile passt.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.
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:
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.
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.