Macos 将图像插入行时,NSTableView中的NSTextField模糊
在基于视图的NSTableView中,每个视图(除其他内容外)都有一个NSTextField和一个位于文本字段正下方的NSImageView 有时,当我在表格顶部插入新行时,该行的NSImageView中有一个图像,其他行中的文本会变得模糊/降级。 滚动几次后,文本将恢复正常 不正常: 确定: 文本仅在带有图像的行之后的行中模糊的示例: 这真的让我觉得这是一个来自Macos 将图像插入行时,NSTableView中的NSTextField模糊,macos,cocoa,nstableview,nstextfield,nsimageview,Macos,Cocoa,Nstableview,Nstextfield,Nsimageview,在基于视图的NSTableView中,每个视图(除其他内容外)都有一个NSTextField和一个位于文本字段正下方的NSImageView 有时,当我在表格顶部插入新行时,该行的NSImageView中有一个图像,其他行中的文本会变得模糊/降级。 滚动几次后,文本将恢复正常 不正常: 确定: 文本仅在带有图像的行之后的行中模糊的示例: 这真的让我觉得这是一个来自.insertRows或notehightofrows的问题 所有图元都在IB中设置了自动布局约束 滚动视图在IB中设置了Cor
.insertRows
或notehightofrows
的问题
所有图元都在IB中设置了自动布局约束
滚动视图在IB中设置了CoreAnimation层。我在准备单元格时也使用该层:
cell.layer?.isOpaque = true
cell.textLabel.layer?.isOpaque = true
有时
cell.layer?.borderColor = someColor
cell.layer?.borderWidth = someWidth
插入行时使用:
// update the model, then:
NSAnimationContext.runAnimationGroup({ (context) in
context.allowsImplicitAnimation = true
self.table.insertRows(at: index, withAnimation: [.effectGap])
})
使用图像更新行:
// in tableViewCell, while populating the table
cell.postImage.image = img
cell.postImage.needsDisplay = true
// once the image is downloaded
table.reloadData(forRowIndexes: ..., columnIndexes: ...)
table.noteHeightOfRows(withIndexesChanged: ...)
如何避免这个问题?调试很困难,因为它并不总是发生,而且我看不出它发生的原因。由于只有在插入图像时文本才会变得模糊,我的第一个想法是NSTextField的帧不是“整数”(其像素值不是整数)。这是导致文本模糊的一个众所周知的原因 您正在使用Cocoa的自动布局功能,因此我的建议是在基于视图的表视图单元格中重写
void Layout()
方法
调用它的超级方法(让Cocoa完成所有需要的布局计算)并将TextField的帧设置为相同的帧,但为整数
补充:虽然文本字段本身可能有一个完整的框架,但它仍然可以在“半像素”(真实屏幕坐标)上显示,这仍然会导致模糊 TextField是单元格的子视图,因此它的帧不在屏幕坐标中,而是在单元格坐标中 示例:让我们假设单元格有一个非整数的
(0.5,0.5,100,100)
框架,而文本字段有一个整数框架(10,10,50,50)
,无论如何都是整数
但是,当文本字段在屏幕上显示时,它将具有以下帧:(10.5、10.5、50、50)
,这是不完整的-并将导致在“半像素”(不完整)上绘制文本字段,从而导致文本模糊
因此,在您的情况下,单元格本身必须在一个整体框架以及文本字段上进行布局,以确保文本字段位于屏幕坐标中的整体框架上
在tableViewCell子类中:
void layout()
{
[super layout];
//**** We have to ensure that the cell is also layed on an integral frame ****//
[self setFrame:NSIntegralRect(self.frame)];
//At this point after calling the [super layout]; myTextField will have a valid (autolayoutwise) frame so all you have to do is to ensure that it is indeed an integral frame doing so by calling NSIntegralRect(NSRect rect); method of Cocoa framework.
[myTetxField setFrame:NSIntegralRect(myTextField.frame)];
//Maybe optionally you will want to set everything to the integral rect :-)
/*
for(NSView * view in self.subViews)
{
[view setFrame:NSIntegralRect(view.frame)];
}
*/
}
您好,可能是图像将文本的半像素推离了它的积分位置,而这些东西导致文本模糊。哦,有趣的想法。也许是自动布局的问题?我不确定我应该如何调试这个,但是…你可以用非常简单的方式测试-在表视图绘制(布局子视图或它的任何名称(抱歉,我不是一个自动布局风扇,因为这样的事情))之后,只需将textfield的框架重置为整体框架-并强制显示。。。类似这样的内容
[myTetxField setFrame:NSIntegralRect(myTextField.frame)]代码>@ColdSteel我会试试的,非常感谢顺便说一句,Waves插件非常棒。我每天都使用它们,谢谢你的出色工作谢谢你,先生:-)!