【问题标题】:NSTextView not properly resizing with auto layoutNSTextView 无法使用自动布局正确调整大小
【发布时间】:2014-06-13 16:42:47
【问题描述】:

我有一个简单的布局,它由 NSView 及其子视图 NSTextView 组成。 NSTextView 以编程方式填充了一些产生多行的文本。我使用自动布局将所有内容联系在一起(全部以编程方式完成)。然而,当一切都显示出来时,NSTextView 被截断,只显示一行。

在网上搜索后,我能找到的最佳答案是:

Using Autolayout with expanding NSTextViews

但是,只有在显示所有内容后手动更改 NSTextView 中的文本时,这才有效(这实际上不是我的用例)。重新调整视图并显示整个 NSTextView。

我试图弄清楚 NSViewController 何时完成子视图的布局,以便我可以在 NSTextView 上调用 invalidateIntrinsicContentSize。相当于 UIViewController 中的viewDidLayoutSubviews

到目前为止,我尝试过的任何方法都没有奏效。我尝试为 NSTextView 调用 invalidateIntrinsicContentSize

  • 结尾loadView
  • 在我用我的文本填充 NSTextView 之后

有没有更好的方法来实现这一点?

【问题讨论】:

    标签: objective-c cocoa nsviewcontroller


    【解决方案1】:

    经过进一步研究,找到了答案:

    1. 创建包含NSTextView 的自定义NSView 子类
    2. NSView子类覆盖layout调用invalidateIntrinsicContentSize的方法

    还可以查看此链接,该链接解释了自动布局和内在内容大小(以及许多其他内容)的微妙之处:

    http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html

    示例代码:

    @interface MyView : NSView
      @property MyTextView *textView;
    @end
    
    @implementation MyView
    
    // init & create content & set constraints
    
    -(void) layout {
        [super layout];
        [self.textView invalidateIntrinsicContentSize];
    }
    
    @end
    

    MyTextView 的实现:

    @implementation MyTextView
    
    - (NSSize) intrinsicContentSize {
        NSTextContainer* textContainer = [self textContainer];
        NSLayoutManager* layoutManager = [self layoutManager];
        [layoutManager ensureLayoutForTextContainer: textContainer];
        return [layoutManager usedRectForTextContainer: textContainer].size;
    }
    
    - (void) didChangeText {
        [super didChangeText];
        [self invalidateIntrinsicContentSize];
    }
    
    @end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      相关资源
      最近更新 更多