如何以编程方式将文本添加到 UIView

Posted

技术标签:

【中文标题】如何以编程方式将文本添加到 UIView【英文标题】:How to programmatically add text to a UIView 【发布时间】:2010-07-09 04:20:40 【问题描述】:

我有一个UIView,我想在其中添加几位文本。我使用了UITextView,但我认为这太过分了,因为它不需要可编辑。我考虑过使用UILabelUITextField,但我不明白你是如何告诉超级视图将UILabelUITextField 放置在自身内部的什么位置。我想要最小的占用空间对象,它可以让我将我选择的字体/颜色/大小的文本放在我想要的UIView 中。不用问太多了吧?

【问题讨论】:

【参考方案1】:

对您来说最简单的方法是:

UILabel *yourLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 300, 20)];

[yourLabel setTextColor:[UIColor blackColor]];
[yourLabel setBackgroundColor:[UIColor clearColor]];
[yourLabel setFont:[UIFont fontWithName: @"Trebuchet MS" size: 14.0f]]; 
[yourSuperView addSubview:yourLabel];

在您的代码中构建或填充视图可能需要您大量使用CGRectMake。 顾名思义,它创建了一个矩形,您可以使用它来设置UIView-Subclass(在本例中为UILabel)的相对位置(相对于您的超级视图的边框)和大小。

它是这样工作的:

yourLabel.Frame = CGRectMake(x, y, width, height); //x,y,width,height are float values.

x 定义了父视图的左边框和您要添加的子视图的开头之间的间距,同样适用于y,但与您的父视图的上边框之间的间距有关。 那么我认为宽度和高度是不言自明的。

希望这能让你走上正轨。

【讨论】:

我在文档中查找了 UILabel 和 UITextField 并看到它们继承自... UITextField : UIControl : UIView : UIResponder : NSObject UILabel : UIView : UIResponder : NSObject 所以我猜是因为它们都继承自 UIView,它们具有 UIView 的所有属性吗? ...加上他们一路上捡到的额外物品?这是有道理的,但是在 UILabel 的文档中,Apple 没有列出除 - (void)drawTextInRect:(CGRect)rect 和 - (CGRect)textRectForBounds:(CGRect)bounds 之外的任何方法 (对于像我这样啰嗦的人来说,评论框太小了......)我可以安全地假设我可以访问链上每个超类的所有属性到 NSObject 我使用的任何类吗?感谢您的帮助,不胜感激! 是的,你是对的,这正是继承的工作原理。我仍然没有得到你想用 drawTextInRect 等实现的东西。 UILabel(或 UITextview )是为您提供功能的视图,允许您以非常简单的方式设置文本。也许我只是没有看到这里的问题:)。【参考方案2】:

您可以使用“center”告诉 UILabel 在视图中的位置,而不是找到一种方法来告诉视图将 UILabel 放置在哪里。

例如

myLabel.center = CGPointMake(0.0, 0.0);

希望您能够使用 UILabel,对我来说它是灵活的不可编辑文本的基本形式。

【讨论】:

谢谢 - 一个漂亮、简洁的表达方式。我认为像 UILabel 这样的东西比完整的 UIView 的开销更少,我是否正确?现在我(想我)意识到它继承自 UIView,这是一个错误的假设吗? 史蒂夫,我认为你是一个完美主义者,这很好。但我们的思路完全不同,UILabel 已经为您提供方便,经过全面测试。 UIView 正在以较低级别的方式进行操作。是的,这可能意味着更少的开销、更快的、更少的内存使用,但是由于付出的努力和可能发生的错误,这值得吗?如果 UILabel 满足您的需求,我建议您使用它,除非您要展示数千个,否则您可以重新考虑使用更有效的做事方式的策略。【参考方案3】:

对于斯威夫特:

    let yourLabel = UILabel(frame: CGRectMake(100, 100, 100, 100))
    yourLabel.textColor = UIColor.whiteColor()
    yourLabel.backgroundColor = UIColor.blackColor()
    yourLabel.text = "mylabel text"
    yoursuperview.addSubview(yourLabel)

【讨论】:

对于 swift 3 仅将 UILabel 语法更改为 UILabel(frame: CGRect(x:100, y:100, width:100, height:100))【参考方案4】:

这个问题很老,但是对于不使用 UILabel 或 UITextField 的纯 UIView 文本选项(正如所有其他答案所描述的,但问题是如何在没有它们的情况下做到这一点),子类 UIView 中的 drawRect 对我有用。像这样:

 - (void)drawRect:(CGRect)rect
     NSString *string = @"Hello World!";
     [string drawAtPoint:CGPointMake(100, 100) withFont:[UIFont boldSystemFontOfSize:16.0]];
 

【讨论】:

我现在收回这句话——实际上这在 ios 7 中是不鼓励的,Apple 说“NSString 类中的许多绘图添加已被弃用,以支持更新的变体。”这意味着 drawAtPoint:WithFont 不是将 nsstring 绘制到 Uiview 中的最佳方式。 你可以使用 - (void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary *)attrs NS_AVAILABLE_IOS(7_0);适用于 iOS7 及更高版本【参考方案5】:

此例程在 X-Y 位置显示文本

-(void)placeText:(NSString *)theText:(int)theX:(int)theY 
    UILabel *textLabel;

    // Set font and calculate used space
    UIFont *textFont = [UIFont fontWithName:@"Helvetica" size:14];
    CGSize textStringSize = [theText sizeWithFont:textFont constrainedToSize:CGSizeMake(300,50) lineBreakMode:NSLineBreakByTruncatingTail];

    // Position of the text
    textLabel = [[UILabel alloc] initWithFrame:CGRectMake(theX+OFFSETIMAGEX-(textStringSize.width/2), theY+OFFSETIMAGEY-(textStringSize.height/2), textStringSize.width,textStringSize.height)];

    // Set text attributes
    textLabel.textColor = [UIColor blackColor];
    textLabel.backgroundColor = [UIColor orangeColor];
    textLabel.font = textFont;
    textLabel.text = theText;

    // Display text
    [self.view addSubview:textLabel];

【讨论】:

【参考方案6】:

可能有点晚了,但这是我使用的:-

CGRect labelFrame = CGRectMake(120,300, 530, 100);
UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame];
//If you need to change the color
[myLabel setTextColor:[UIColor whiteColor]];
//If you need to change the system font
[myLabel setFont:[UIFont fontWithName:NULL size:23]];
//If you need alignment
[myLabel setTextAlignment:NSTextAlignmentCenter];
// The label will use an unlimited number of lines
[myLabel setNumberOfLines:0];
//Add label view to current view
[self.view addSubview:myLabel];
NSString *someString = @"Sample String, Yarp!";
myLabel.text = someString;

【讨论】:

【参考方案7】:

将 UILabel 添加到您的视图中。然后覆盖 View 的 layoutSubviews 方法。

【讨论】:

以上是关于如何以编程方式将文本添加到 UIView的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将自定义 uiview 添加到视图控制器 SWIFT

如何以编程方式将自定义 UIView 添加到 UIScrollView 之上的 Stackview?

如何以编程方式将 UILabel 和 UiImageView 添加到表视图单元格内的 UIView?

iOS 以编程方式添加 UITextField 在编辑时不会将文本滚动到光标位置

如何以编程方式将 UIView 粘贴到其超级视图的右侧

以编程方式添加带有约束的 UITextField