Вы смешиваете концепцию рамки и прямоугольников границ.«Границы» относятся к размерам представления в его собственной системе координат, то есть начало координат будет нулевым, а размер будет шириной и высотой представления.
«Рамка» относится к измерениям представления в координате его родительского представления.system, то есть источник будет находиться там, где представление расположено в его суперпредставлении, а ширина и высота будут такими же, как у прямоугольника границ.
Так что для регистрации в вашем примере кода вы вызываете "convertPoint«Излишне и неправильно, потому что вы можете получить фактическое происхождение представления, просто вызвав« [self frame] .origin »
При выполнении рисования вам нужно вызвать« [self bounds] », чтобы получить прямоугольник, в которомрисовать.В вашем коде вы вызываете «[self frame]», который дает вам прямоугольник в системе координат вашего суперпредставления (frame), но это не сработает, потому что процедуры рисования отрисовываются в собственной (bounds) системе координат представления (то есть с началом координат)at {0, 0})
Исключением из этого является случай, когда представление заполняет все содержимое своего суперпредставления, и в этом случае вы можете вызвать либо [self bounds], либо [self frame], так как обавернуть тот же прямоугольник.
Я получил ваш код на работу, изменив
NSRect cellFrame = [self frame];
на
NSRect cellFrame = [self bounds];
Кроме того, проще всего зарегистрировать NSRect, например,
NSLog(@"%@", NSStringFromRect([self frame]));
.
Надеюсь, это поможет.