【问题标题】:NSString sizeWithAttributes: content rectNSString sizeWithAttributes: 内容矩形
【发布时间】:2010-01-02 21:39:16
【问题描述】:

如何获得 NSString 的大小,就好像它在 NSRect 中绘制一样。问题是当我尝试 -[NSString sizeWithAttributes:] 时,它返回一个 NSSize,就好像它具有无限宽度一样。我想给该方法一个最大宽度。有什么办法吗? (顺便说一句:Mac 操作系统,而不是 iPhone 操作系统)

谢谢, 亚历克斯

【问题讨论】:

    标签: cocoa xcode macos nsstring


    【解决方案1】:
    float heightForStringDrawing(NSString *myString, NSFont *myFont,
            float myWidth)
    {
     NSTextStorage *textStorage = [[[NSTextStorage alloc] initWithString:myString] autorelease];
     NSTextContainer *textContainer = [[[NSTextContainer alloc] initWithContainerSize:NSMakeSize(myWidth, FLT_MAX)] autorelease];
     ;
            NSLayoutManager *layoutManager = [[[NSLayoutManager alloc] init] autorelease];
     [layoutManager addTextContainer:textContainer];
     [textStorage addLayoutManager:layoutManager];
     [textStorage addAttribute:NSFontAttributeName value:myFont
          range:NSMakeRange(0, [textStorage length])];
     [textContainer setLineFragmentPadding:0.0];
    
     (void) [layoutManager glyphRangeForTextContainer:textContainer];
     return [layoutManager
       usedRectForTextContainer:textContainer].size.height;
    }
    

    毕竟它在文档中。无论如何,谢谢约书亚!

    【讨论】:

      【解决方案2】:

      我为启用了 ARC 的 iOS 修改了 Alexandre Cassagne's answer

      CGSize ACMStringSize(NSString *string, UIFont *font, CGSize size)
      {
          NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:string];
          [textStorage addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, [textStorage length])];
          NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
          NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:size];
          textContainer.lineFragmentPadding = 0;
          [layoutManager addTextContainer:textContainer];
          [textStorage addLayoutManager:layoutManager];
          return [layoutManager usedRectForTextContainer:textContainer].size;
      }
      

      【讨论】:

        【解决方案3】:

        我相信您在这里唯一的选择是 NSLayoutManager 并要求为给定字形范围合并使用的矩形。

        【讨论】:

          【解决方案4】:

          对于 OSX 可可/Swift 4: (使用自定义 NSview 来展示如何绘制)

          //
          //  CustomView.swift
          //  DrawMyString
          //
          //  Created by ing.conti on 19/10/2018.
          //  Copyright © 2018 com.ingconti. All rights reserved.
          //
          
          import Cocoa
          
          class CustomView: NSView {
          
              override func draw(_ dirtyRect: NSRect) {
                  super.draw(dirtyRect)
          
                  let s : NSString = "AA BB CC DD EE FF"
                  let W = 50
                  let size = NSSize(width: W, height: 100)
          
                  let boundingRectWithSize  = s.boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: [:])
          
                  let r = NSRect(origin: CGPoint(x: 20, y: 30), size: boundingRectWithSize.size)
          
                  s.draw(in: r, withAttributes: [:])
                  r.frame()
              }
          }
          

          (我们也画边框,看看)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-05-15
            • 2013-10-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-26
            相关资源
            最近更新 更多