我想在固定宽度的框中绘制一些NSAttributedStrings,但是在计算绘制它们时会占用的正确高度时遇到问题.到目前为止,我已经尝试过:
调用- (NSSize) size,但结果是无用的(为此目的),因为他们会给出字符串所需的宽度.
- (void)drawWithRect:(NSRect)rect options:(NSStringDrawingOptions)options使用矩形调用我想要的宽度和NSStringDrawingUsesLineFragmentOrigin选项,就像我在绘图中使用的那样.结果......难以理解; 当然不是我想要的.(正如许多地方所指出的,包括这个 Cocoa-Dev线程).
创建一个临时的NSTextView并执行:
当我查询tmpView的框架时,宽度仍然是所需的,并且高度通常是正确的......直到我得到更长的字符串,当它通常是所需尺寸的一半时.(似乎没有最大尺寸被击中:一帧将是273.0高(约300太短),另一帧将是478.0(只有60-ish太短)).
[[tmpView textStorage] setAttributedString:aString];
[tmpView setHorizontallyResizable:NO];
[tmpView sizeToFit];
如果有人管理过这个,我会感激任何指点.
有人可以向我解释NSTextField和NSTextView之间的主要区别是什么?我知道NSTextView有更多的功能,通常用于更长的文本,NSTextField通常用于单行纯文本字段,但如果我理解正确,NSTextField也可以用于属性字符串和多行......
我特别需要的是一个控件,它可以在Tweetie或任何其他类似软件中的时间线视图中显示消息文本.我唯一的要求是:
有了这样的要求,我使用NSTextField或NSTextView会更好吗?NSTextField是否足够好,或者NSTextView是否具有NSTextField不重要的东西?
在Xcode 5上将项目从iOS5.0转换为iOS7/iOS6.下面的代码给出了编译时警告:
'sizeWithFont:constrainedToSize:lineBreakMode:'不推荐使用:首先在ios 7.0中弃用 - 使用 - boundingRectWithSize:options:attribiutes:context
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0)
{
self.lblHidden.frame = CGRectMake(58, 228, 945, 9999);
self.lblHidden.text = detailShareObj.pDesc;
CGSize size = [detailShareObj.pDesc sizeWithFont:self.lblHidden.font constrainedToSize:self.lblHidden.frame.size lineBreakMode:NSLineBreakByWordWrapping];
return 228.0+size.height+20;
}
else if (indexPath.section == 1)
{
NSString *tempPointStr = (self.shortDescArray)[indexPath.row];
self.lblHidden.frame = CGRectMake(58, 0, 945, 9999);
self.lblHidden.text = tempPointStr;
CGSize size = [tempPointStr sizeWithFont:self.lblHidden.font
constrainedToSize:self.lblHidden.frame.size
lineBreakMode:NSLineBreakByWordWrapping];
return 50.0f;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了其他地方给出的一些建议,但是如果有人可以通过提供代码中所需的更正来提供帮助,那么没有什么可以解决的.
我正在尝试使用Core Text函数绘制文本,其行间距尽可能接近使用NSTextView时的行间距.
以此字体为例:
NSFont *font = [NSFont fontWithName:@"Times New Roman" size:96.0];
Run Code Online (Sandbox Code Playgroud)
如果我在NSTextView中使用它,这个字体的行高是111.0.
NSLayoutManager *lm = [[NSLayoutManager alloc] init];
NSLog(@"%f", [lm defaultLineHeightForFont:font]); // this is 111.0
Run Code Online (Sandbox Code Playgroud)
现在,如果我使用Core Text做同样的事情,结果是110.4(假设您可以通过添加上升,下降和前导来计算线高).
CTFontRef cFont = CTFontCreateWithName(CFSTR("Times New Roman"), 96.0, NULL);
NSLog(@"%f", CTFontGetDescent(cFont) + CTFontGetAscent(cFont) +
CTFontGetLeading(cFont)); // this is 110.390625
Run Code Online (Sandbox Code Playgroud)
这非常接近111.0,但对于某些字体,差异要大得多.例如,对于Helvetica,NSLayoutManager给出115.0而CTFont上升+下降+领先= 96.0.很明显,对于Helvetica,我无法使用上升+下降+导致计算线之间的间距.
所以我想我会使用CTFrame和CTFramesetter来布局几行并从中获取行间距.但这也给出了不同的价值观.
CTFontRef cFont = CTFontCreateWithName(CFSTR("Times New Roman"), 96.0, NULL);
NSDictionary *attrs = [NSDictionary dictionaryWithObject:(id)cFont forKey:(id)kCTFontAttributeName];
NSAttributedString *threeLines = [[NSAttributedString alloc] initWithString:@"abcdefg\nabcdefg\nabcdefg" attributes:attrs];
CTFramesetterRef threeLineFramesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)threeLines);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0.0, …Run Code Online (Sandbox Code Playgroud) 我的应用程序包含一个NSScrollView文档视图,其中包含一些垂直堆叠的文件NSTextViews- 每个文本视图在添加文本时都会在垂直方向上调整大小.
目前,这都是在代码中管理的.该NSTextViews自动调整,但我观察他们调整大小有NSViewFrameDidChangeNotification,重计算其所有来源,使他们不重叠,并调整其上海华盈(滚动视图的文档视图),使它们都适合和可滚动到.
这似乎是自动布局的完美候选人!我NSLayoutConstraints在第一个文本视图和它的容器,最后一个文本视图及其容器之间设置,以及彼此之间的每个文本视图.然后,如果任何文本视图增长,它会自动"按下"它下面的文本视图的来源以满足约束,最终增加文档视图的大小,每个人都很高兴!
除此之外,似乎没有办法NSTextView在基于约束的布局中添加文本时自动增长?使用与NSTextView之前输入的文本自动扩展完全相同的内容,如果我没有为其高度指定约束,则将其自动解析为0并且不显示.如果我确实指定了约束,即使是不等式(例如> = 20),它仍然会停留在该大小,并且不会随着文本的添加而增长.
我怀疑这与NSTextView的实现有关-intrinsicContentSize,默认情况下会返回(NSViewNoInstrinsicMetric, NSViewNoInstrinsicMetric).
所以我的问题是:如果我根据我的文本布局NSTextView返回更有意义intrinsicContentSize的子类,那么我的自动布局会按预期工作吗?
关于实现intrinsicContentSize垂直调整大小NSTextView的任何指针?
好的,我需要的应该是非常简单的.然而,我到处寻找,我不确定我发现了100%有效的东西(这也是过去困扰我的东西).
所以,我们在这里:
NSTextViewNSTextView应向下滚动(以便最新的附加内容可见)相当直截了当,是吧?
所以...任何想法?(完全执行这个简单"技巧"的代码示例将非常理想......)
当你读到这里在大多数情况下,IBOutlet应该是弱.
现在,您可以在开发库中阅读并非所有类都支持弱引用.(例如NSTextView).这意味着您必须使用assign:
@property (assign) IBOutlet NSTextView *textView;
Run Code Online (Sandbox Code Playgroud)
如果使用弱引用,您将收到以下错误:"不允许合成弱不可用属性,因为它需要合成__weak对象的ivar"
文档错过的内容是现在你必须在使用后再将属性设置为nil,例如通过一种dealloc方法:
- (void)dealloc
{
self.textView = nil;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,标NS_AUTOMATED_REFCOUNT_WEAK_UNAVAILABLE有的类不支持弱引用,但原因是什么?
我找不到任何与a中显示的文本值相关的参数NSTextView.我知道a NSTextView使用复杂的结构(有NSLayoutManager...等),但我找不到修改当前text值的有效方法.
我试图在NSTextView中设置一个属性字符串.我想根据其内容增加其高度,最初将其设置为某个默认值.
所以我试过这个方法:
我在NSTextView中设置内容.当我们在NSTextView中设置一些内容时,它的大小会自动增加.所以我将其超级视图的高度NSScrollView增加到它的高度,但是NSScrollView没有完全调整大小,它在右边显示了滚动条.
float xCoordinate = 15.0;
[xContentViewScroller setFrame:NSMakeRect(xCoordinate, 0.0, 560.0, 10.0)];
[[xContentView textStorage] setAttributedString:xContents];
float xContentViewScrollerHeight = [xfContentView frame].size.height + 2;
[xContentViewScroller setFrame:NSMakeRect(xCoordinate, 0.0, 560.0, xContentViewScrollerHeight)];
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议我一些方法或方法来解决这个问题.通过谷歌搜索,我发现在UITextView中有contentSize方法可以获得其内容的大小,我试图在NSTextView中找到类似的方法,但无法取得任何成功:(
我需要找到一个文本NSTextView,并将其保存到文件中.我可以保存罚款.我已经习惯了-stringValue,-textStorage到目前为止,但都没有用过.当我输入-stringValue时,它只是给了我(null),当我输入-textStorage时,它给了我很大一部分(就像一段长长的隐形文本).
如何将文本从一个文本中NSTextView删除NSString?
nstextview ×10
cocoa ×7
macos ×4
objective-c ×4
appkit ×1
autolayout ×1
core-text ×1
iboutlet ×1
ios ×1
nsstring ×1
nstextfield ×1
osx-lion ×1
text ×1
uikit ×1
weak ×1
xcode ×1