【问题标题】:Center Multi-Line Text on UIButton using IB使用 IB 在 UIButton 上居中多行文本
【发布时间】:2012-01-27 14:58:35
【问题描述】:

如何使用 Interface Builder 在 UIButton 中逐行居中文本?我正在搜索选项,只是没有看到它。这是按钮:

【问题讨论】:

  • 文本默认居中。如果你要改变它,你可以在“控制>对齐”下进行,你的设置为水平居中和垂直居中。你的 UIButton 目前是什么样子的?
  • 一切都向左对齐。
  • 我认为真正的问题是您试图在 UIButton 中将多行文本居中...我将更改您的标题以反映这一点。
  • 看起来 UIButton 使文本居中,但它作为一个整体居中(即文本块居中,而不是每一行)。我刚刚在界面生成器中尝试过。您想单独将每条线居中吗?
  • 是的。是不是有一些内置的方法可以做到这一点?似乎无法在NIB中完成。我不可能是第一个遇到这个问题的人。

标签: iphone ios interface-builder multiline


【解决方案1】:

您不能将文本设置为在您的笔尖居中。但是您可以更改代码中的对齐方式:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.myButton.titleLabel.textAlignment = UITextAlignmentCenter;
}

【讨论】:

  • +1 @sdknewbie 你试过这个吗?这是一个有趣的答案,因为他正在设置按钮中标签的文本对齐方式。如果这解决了问题,请标记为答案。如果没有,请发表评论。
  • 这个想法看起来很有趣,但没有奏效。我收到 SIGABRT 错误。这是日志条目。 “无法识别的选择器发送到实例。”我很确定我在应用程序编译时正确连接了按钮,但是当我选择带有按钮的视图时崩溃......但我是新手!
  • 日志条目还告诉您无法识别的选择器以及接收它的实例的类。如果您也发布这些信息,我们会更有帮助。
  • 设置 textAlignment = UITextAligmentCenter 在我的测试项目中有效。
  • 对于 iOS8(和 Swift)你必须使用NSTextAlignment.Center。如果您制作自己的按钮类,您可以在其初始化/构造函数中执行此操作:self.titleLabel?.textAlignment = NSTextAlignment.Center
【解决方案2】:

我知道这是一个老问题,但我在尝试将 IB 中的 UIButton 的多行文本居中时遇到了这个问题。我发现默认情况下,当“title”设置为“plain”并且“line break”设置为“word wrap”时,标题文本的最长行居中,其他行与该行对齐(类似于 OP 的屏幕截图)。

为了使所有行正确居中,需要将“title”更改为“attributed”。这提供了更多选项来自定义标题文本的外观。将每行文本居中(您现在实际上可以单独更改每行的对齐方式)。还要确保在文本上方的“更多...”下将“换行”设置为“自动换行”。这个换行选项的行为似乎存在一个错误,至少目前在 Xcode 4.5 中,因为 IB 中按钮上的文本看起来不正确,截断除第一行之外的所有内容。似乎“自动换行”和截断选项在 IB 中被向后解释,但如果您运行应用程序,它在模拟器中的行为正确。

【讨论】:

    【解决方案3】:

    其实你可以在界面生成器中做到这一点。

    只需将 Title 设置为“Attributed”,然后选择居中对齐即可。

    @from cmets : 要换行,您需要将换行设置为换行或换行。

    P.S : 这可能不会在 xcode 中呈现。但是,它将在运行时工作。

    【讨论】:

    • 那么它不换行,wth?
    • 要换行,您需要将换行设置为字符换行或自动换行。
    • 这真的是最好的解决方案,因为它只是最简单方便,没有任何代码甚至运行时属性
    • 这是正确的答案,至少在 2016 年以及扩展 IB 支持的更好的 Xcode 版本。
    【解决方案4】:

    您可以通过storyboard在UIButton中设置居中的多行文字。

    这是使文本有两行或多行的方法。

    将以下关键路径设置为

    Identity Inspector --> 用户定义的运行时属性 --> 在下面添加新的键值对

    titleLabel.textAlignment - NSNumber - 1
    

     titleLabel.numberOfLines - NSNumber - 5 - or use "0" meaning "any number"
    

    看起来像这样:

    请注意,(2016 年)不幸的是,它实际上并没有在 Storyboard 中显示两行或多行文本(您只看到第一行),但当您在模拟器或设备中运行时,它可以完美运行。

    【讨论】:

    • 它有效,但我写为“titleLabel.numberOfLines”。我不知道它是否可以在没有大写字母的情况下工作。谢谢。
    【解决方案5】:

    对于 IB,将 Title 设置为“Attributed”并选择居中对齐(如 Alexander Danilov suggested

    但如果你想在代码中使用 Swift 4

    // center button text
    yourButton.titleLabel?.textAlignment = .center 
    
    // enable multiline if needed
    yourButton.titleLabel?.numberOfLines = 0 
    

    【讨论】:

      【解决方案6】:

      并非所有选项都使用 Interface Builder 完成,因此您必须通过编码完成其中一些选项,通常我们在函数 viewDidLoad 中完成它们。

      要通过代码在按钮内居中文本,您可以使用以下代码:

      button1.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
      

      您可以使用相同的技术将文本对齐到任意方向,例如向左对齐:

      button1.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
      

      但这会使文本向左移动太多,您可能希望在它保持向左对齐之前留出一些空间,因此您在对齐代码之后添加一个插入,如下所示:

      button1.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
      

      在这种情况下,我们将文本从 Y 轴推了 10 个点。我在这里说的是点而不是像素,因为如您所知,Apple 使用点技术来测量距离,以便能够在正常显示和视网膜显示(其中视网膜是正常显示的 2 倍)之间轻松适应。

      【讨论】:

      • -1 这对提出问题的人(或其他任何人)有何帮助?
      • 问题是关于 Interface Builder 而不是关于代码的问题,这个答案通过说它不能完成来服务于这个目标。此外,此答案提供了有关在哪里进行编码的见解(在viewDidLoad 内)。如果提问的人不知道编码方式,我们希望看到他对此答案发表评论,然后我们将通过代码回复他的新评论。通过这一点,我看到这个答案可以帮助提出问题的人,并感谢您的评论。
      • 这是一个公平的回应,但是我不能改变我的投票,除非你改变你的答案(经过这么多小时后被 SO 强制约束 - 谁知道)。虽然我希望看到一个替代解决方案,但你说得对,用户没有要求。
      【解决方案7】:

      我还没有尝试过,但我认为一种方法可能是在您的按钮顶部创建一个 CGRect,然后将其用作框架,创建一个标签,然后您可以使用该标签,将textAlignment属性设置为UITextAlignmentCenter,并将背景颜色设置为清晰。

      这适用于uitableview,但我不知道这是否适用于按钮。希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2011-08-08
        • 2020-11-16
        • 1970-01-01
        • 2012-06-12
        • 2013-02-16
        • 1970-01-01
        • 2014-09-02
        • 2011-01-27
        • 2013-07-01
        相关资源
        最近更新 更多