Как может существование `-saveGraphicsContext` и `-restoreGraphicsContext` вызывать эти проблемы в 10.10?

#cocoa #appkit #graphicscontext

#какао #appkit #graphicscontext

Вопрос:

У нас есть обычай NSPopUpButtonCell и переопределение этого метода:

 - (void)drawBorderAndBackgroundWithFrame:(NSRect)cellFrame inView:(NSView*)controlView
{
   [[NSGraphicsContext currentContext] saveGraphicsState];
   CGFloat strokeWidth = 1;
   cellFrame = NSInsetRect(cellFrame, strokeWidth/2.0, strokeWidth/2.0);

   NSBezierPath* rectanglePath = [NSBezierPath bezierPathWithRoundedRect:cellFrame xRadius:2 yRadius:2];
   rectanglePath.lineWidth = strokeWidth;

   if (self.horizontalImageOffset != 0)
   {
      CGRect stateImageRect = [self stateImageRectForBounds:cellFrame];
      CGFloat verticalSeparatorX = NSMaxX(stateImageRect);

      NSBezierPath* verticalSeparator = [NSBezierPath bezierPath];
      [verticalSeparator moveToPoint:NSMakePoint(verticalSeparatorX, NSHeight(cellFrame) - strokeWidth)];
      [verticalSeparator lineToPoint:NSMakePoint(verticalSeparatorX, strokeWidth   1)];
      verticalSeparator.lineWidth = strokeWidth;

      [verticalSeparator stroke];
   }

   [NSGraphicsContext restoreGraphicsState];
}
  

Проблема в том, что когда я привожу этот класс в свой проект, это приводит к исчезновению другого из моих (не связанных) представлений — например, не будет отображаться должным образом

введите описание изображения здесь

Если я закомментирую -saveGraphicsState и -restoreGraphicsState , он работает и правильно отображает мой другой вид

введите описание изображения здесь

Что здесь может быть не так?

РЕДАКТИРОВАТЬ: Кикер в том, что товарищи по команде в 10.11 и 10.12 не видят этой проблемы

Ответ №1:

Я думаю, вам следует позвонить

 [NSGraphicsContext saveGraphicsState];
  

не

 [[NSGraphicsContext currentContext] saveGraphicsState];