Macos 将图像插入行时,NSTableView中的NSTextField模糊

Macos 将图像插入行时,NSTableView中的NSTextField模糊,macos,cocoa,nstableview,nstextfield,nsimageview,Macos,Cocoa,Nstableview,Nstextfield,Nsimageview,在基于视图的NSTableView中,每个视图(除其他内容外)都有一个NSTextField和一个位于文本字段正下方的NSImageView 有时,当我在表格顶部插入新行时,该行的NSImageView中有一个图像,其他行中的文本会变得模糊/降级。 滚动几次后,文本将恢复正常 不正常: 确定: 文本仅在带有图像的行之后的行中模糊的示例: 这真的让我觉得这是一个来自.insertRows或notehightofrows的问题 所有图元都在IB中设置了自动布局约束 滚动视图在IB中设置了Cor

在基于视图的NSTableView中,每个视图(除其他内容外)都有一个NSTextField和一个位于文本字段正下方的NSImageView

有时,当我在表格顶部插入新行时,该行的NSImageView中有一个图像,其他行中的文本会变得模糊/降级。

滚动几次后,文本将恢复正常

不正常:

确定:

文本仅在带有图像的行之后的行中模糊的示例:

这真的让我觉得这是一个来自
.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插件非常棒。我每天都使用它们,谢谢你的出色工作谢谢你,先生:-)!