我在计算NSTextField
. 我尝试的任何方法总是返回太小的值。
对我来说,问题原来是,出于某种原因,NSTextField
' 的attributedStringValue
属性从未包含我通过 Interface Builder 设置的任何属性。如果我没有以编程方式设置属性字符串,它实际上根本不包含任何属性。连字体都没有。这就是为什么所有的高度计算都搞砸了。
为了让它工作,我创建了Category
一个NSTextField
自定义函数来获取正确的属性字符串。
这是它的实现文件Category
:
//
// --------------------------------------------------------------------------
// NSTextField+Additions.m
// Created for Mac Mouse Fix (https://github.com/noah-nuebling/mac-mouse-fix)
// Created by Noah Nuebling in 2021
// Licensed under MIT
// --------------------------------------------------------------------------
//
#import "NSTextField+Additions.h"
@implementation NSTextField (Additions)
// Copy paste template for adding attributes to an attributed string. Contains all possible attributes
// [str addAttributes:@{
// NSFontAttributeName: NSNull.null,
// NSParagraphStyleAttributeName: NSNull.null,
// NSForegroundColorAttributeName: NSNull.null,
// NSBackgroundColorAttributeName: NSNull.null,
// NSLigatureAttributeName: NSNull.null,
// NSKernAttributeName: NSNull.null,
// NSStrikethroughStyleAttributeName: NSNull.null,
// NSUnderlineStyleAttributeName: NSNull.null,
// NSStrokeColorAttributeName: NSNull.null,
// NSStrokeWidthAttributeName: NSNull.null,
// NSShadowAttributeName: NSNull.null,
// NSTextEffectAttributeName: NSNull.null,
// NSAttachmentAttributeName: NSNull.null,
// NSLinkAttributeName: NSNull.null,
// NSBaselineOffsetAttributeName: NSNull.null,
// NSUnderlineColorAttributeName: NSNull.null,
// NSStrikethroughColorAttributeName: NSNull.null,
// NSObliquenessAttributeName: NSNull.null,
// NSExpansionAttributeName: NSNull.null,
// NSWritingDirectionAttributeName: NSNull.null,
// NSVerticalGlyphFormAttributeName: NSNull.null,
// } range:NSMakeRange(0, str.length)];
/// In my testing NSTextField.attributedStringValue actually returned a string without _any_ attributes. Not even a font or anything.
/// This lead to issues when trying to calculate the fitting height for a certain width of the NSTextField.
/// This function takes some of the properties of the NSTextField and returns an NSAttributed string based on those.
/// I'm not sure this is perfect, but the returned attributed string describes the way that the text of the NSTextField is rendered close enough to be usable for my height calculations
- (NSAttributedString *)effectiveAttributedStringValue {
NSMutableAttributedString *str = self.attributedStringValue.mutableCopy;
// Create paragraph style from NSTextField properties
// Not sure if we're setting these properties correctly, and there could be more properties we should be setting
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.alignment = self.alignment;
paragraphStyle.baseWritingDirection = self.baseWritingDirection;
paragraphStyle.lineBreakMode = self.lineBreakMode;
paragraphStyle.allowsDefaultTighteningForTruncation = self.allowsDefaultTighteningForTruncation;
if (@available(macOS 10.15, *)) paragraphStyle.lineBreakStrategy = self.lineBreakStrategy;
// Add attributes to AttributedString based on NSTextField properties
[str addAttributes:@{
NSFontAttributeName: self.font,
NSParagraphStyleAttributeName: paragraphStyle,
NSForegroundColorAttributeName: self.textColor,
NSBackgroundColorAttributeName: self.backgroundColor,
// NSLigatureAttributeName: NSNull.null,
// NSKernAttributeName: NSNull.null,
// NSStrikethroughStyleAttributeName: NSNull.null,
// NSUnderlineStyleAttributeName: NSNull.null,
// NSStrokeColorAttributeName: NSNull.null,
// NSStrokeWidthAttributeName: NSNull.null,
// NSShadowAttributeName: NSNull.null, //self.shadow,
// NSTextEffectAttributeName: NSNull.null,
// NSAttachmentAttributeName: NSNull.null,
// NSLinkAttributeName: NSNull.null,
// NSBaselineOffsetAttributeName: NSNull.null, //self.baselineOffsetFromBottom,
// NSUnderlineColorAttributeName: NSNull.null,
// NSStrikethroughColorAttributeName: NSNull.null,
// NSObliquenessAttributeName: NSNull.null,
// NSExpansionAttributeName: NSNull.null,
// NSWritingDirectionAttributeName: NSNull.null, //self.baseWritingDirection,
// NSVerticalGlyphFormAttributeName: NSNull.null,
} range:NSMakeRange(0, str.length)];
// return NSAttributedString
return str;
}
@end
随机旁注
- 我
UILabel
在这个线程中读到的一些关于人们的问题听起来很像他们可能相关。
- 我最终决定使用
NSTextView
over,NSTextField
因为它获取属性字符串的方法是开箱即用的,并且NSTextField
用于可点击链接的方法也完全拙劣。我的印象NSTextField
是,除了最基本的用例之外,您应该避免的只是一个错误的混乱。