UITextView - 在XCode 5上,iOS 6版本无法设置字体。

66

我正在使用故事板作为我的用户界面。我之前使用的是XCode 4.6并发布在iOS 6上。我已经更新到使用XCode 5的iOS 7,并更新了故事板以使其与XCode 5兼容。不过我有一个问题:

UITextView无法在代码中显示字体更改。文本颜色更改正常工作。任何其他属性更改都可以。但是字体却不行。我之前在使用自定义字体,所以我尝试使用不同的字体和大小(例如systemFontOfSize:),但这并没有起作用。文本视图显示在故事板中设置的字体。我可能遗漏了什么?是否有任何自动布局约束会影响到这种情况?在迁移过程中我也遇到了一些约束问题,但是如我所说,在iOS 7中字体正常工作。

我猜这可能是故事板中我错过的某些内容,如果我创建一个UIViewController并在代码中添加文本视图,则可以正常运行。

我可以贴一些代码,但在这种情况下我不确定它是否有帮助。


2
这是iOS中最奇怪的错误,而且到现在为止仍然完全无法解决(2016年中期)。 - Fattie
12个回答

114

更奇怪的是,这只会在iPhone上发生,而不会在iPad上出现。

如果您在代码中设置字体并且不希望使用可编辑的文本视图,请执行以下操作:

textView.editable = YES;
textView.font = newFont;
textView.editable = NO;

我在UILabel上遇到了同样的问题。你有什么办法可以克服这个问题吗? - Amrendra Pratap Singh
我没有在标签上看到这个。我猜想你的 IBOutlet 没有正确连接。你的标签是 nil 吗? - jab
2
同样适用于textColor。 - rharvey
1
谢谢,这个技巧对我很有用...我正在使用Xcode 6.2和iOS 8.2。 - Kirti Nikam
9
可悲的是,在iOS9中仍然需要。 - tounaobun
显示剩余4条评论

74

在我的情况下,这与UITextView的“selectable”属性有关。

因此,我在Storyboard Editor中检查了UITextView的“selectable”属性,并将其设置为是(YES)。 To set selectable

然后在viewWillAppear中将此属性设置为否(NO)。

textview.text = @"some text";
textview.selectable = NO;

11
这其实也是我的问题。毫无意义。 - Tom Kincaid
1
同样的问题 - 在Storyboard中将文本设置为白色 - 没有任何变化,仍然保持“默认”状态,直到我设置“可选择” - 为什么? - Stephen O'Connor
1
也对我有用。虽然和同事交谈后,我们认为这可能是因为它导致UITextView重新绘制。 - user1940321

56

这个问题是由于Storyboard中editable属性为false而导致的。我完全不知道为什么这会导致字体保持不变 - 而且只有在iOS 6上。


10
这对我没有用,但是先设置文本后设置字体可以。感谢苹果! - ToddB
2
检查“可选择”或“可编辑”对我也起作用了。这绝对是苹果的一个错误。 - Cameron E
这也适用于我的情况中的文本颜色。 - Kent Robin
2
问题和解决方案仍适用于iOS 9(Xcode 7.3) - marco
你真让人失望,苹果!竟然偷走了我的时间! - Murat Yasar

21

如果你先设置UITextView的文本,然后再设置字体(颜色相同),那对我来说就是有效的工作。

_myTextView.text = @"text";
[_myTextView setFont:[UIFont fontWithName:@"Helvetica Neue" size:18.0f]];
_myTextView.textColor = [UIColor whiteColor];

1
真是疯狂,我们不得不尝试各种代码的混合来让最基本的东西像这样工作。这是唯一一个对我有效的方法。 - dragonflyesque
@dragonflyesque 是的...那是为iOS 6设计的。你在iOS 9上测试了吗?结果一样吗? - Jordan Montel
1
这帮助我解决了iOS 8的问题。 - dragonflyesque

13

感谢大家提供的所有答案。这个问题在iOS9上仍然存在。我发现,当您在接口生成器中设置"User Interaction Enabled = false"时,您可以将Editable Selectable设置为 true ,并且用户将无法编辑文本视图。

因此,我的解决方案是:

  1. 在IB中设置 User Interaction Enabled = False
  2. 在IB中设置 Editable = True
  3. 在IB中设置 Selectable = True
  4. 按照您想要的方式配置文本视图。

11

Swift代码:

textOutlet.editable = true
textOutlet.textColor = UIColor.whiteColor()
textOutlet.font = UIFont(name: "ArialMT", size: 20)
textOutlet.editable = false

或者,如果您首先更改文本,则问题会像魔术般得到解决。

textOutlet.text = "omg lol wtf"
textOutlet.textColor = UIColor.whiteColor()
textOutlet.font = UIFont(name: "ArialMT", size: 20)

7
我发现字体大小被忽略了。通过在Storyboard中选择UITextView并勾选名为“可选”的复选框,问题得到解决。

5

当在界面构建器中将Selectable属性设置为FALSE时,才会出现此问题。

如果需要将Editable和Selectable属性都设置为FALSE,请从代码中进行设置,而不是在界面构建器中进行设置。

总之,在界面构建器中将Editable和Selectable属性都设置为YES,然后在需要将这些属性设置为FALSE的情况下添加以下代码:

_textView.editable   = NO;
_textView.selectable = NO;

希望这能帮到你,

1

对我有效的 Swift 3 类别:

extension UITextView {
    func setFontAndUpdate(_ font: UIFont?) {
        self.font = font

        // Font doesn't update without text change
        let text = self.text
        self.text = nil
        self.text = text
    }
}

0
在我的情况下(使用Xcode 7.3,iOS 9进行开发),导致问题的原因是设置文本和字体家族/大小的顺序,而不是可编辑或可选择的选项,许多答案都是这样说的。(并且我没有在那个TextView上得到任何故事板或xib。)
如果我像这样输入:
[myTextView setFont:[UIFont fontWithName:@"HelveticaNeue-Italic" size:20]];
myTextView.attributedText = mAttStr;

然后字体的家族和大小不会改变,但是如果我颠倒这两步,它就可以工作。设置文本应该在设置字体家族/大小之前。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接