Подвид подкласса NSView неправильно позиционируется после рисования кольца фокусировки

Я хотел создать кольцо фокусировки за пределами подкласса NSView, чтобы идентифицировать выделение. Отсюда моя ссылка: Ссылка.

Я пошел по ссылке, переписал -drawRect метод как:

@property (nonatomic) BOOL shouldDisplayFocus;
...

- (void)drawRect:(NSRect)dirtyRect
{
// Drawing code here.
if (_shouldDisplayFocus)
{
    [self setKeyboardFocusRingNeedsDisplayInRect:[self bounds]];
}

[super drawRect:dirtyRect];
[[NSColor blackColor] set];
NSRectFill(dirtyRect);

if (_shouldDisplayFocus)
{
    NSSetFocusRingStyle(NSFocusRingTypeExterior);
    NSBezierPath *path = [NSBezierPath bezierPathWithRect:NSInsetRect([self bounds], -1.0, -1.0)];
    [[NSColor blackColor] set];
    [path stroke];

    [NSGraphicsContext restoreGraphicsState];
}
}

И его -mouseDown: Метод также перезаписывается:

- (void)mouseDown:(NSEvent *)theEvent
{
[super mouseDown:theEvent];
if (_delegate && [_delegate respondsToSelector:@selector(mouseDownAtView:withEvent:)])
{
    [_delegate mouseDownAtView:self withEvent:theEvent];
}
}

И после того, как представление будет щелкнуто, его делегат установит / отменит фокусировочное кольцо, что сделает его -drawRect: позвонил снова.




Это сработало и сгенерировало кольцо фокусировки вне вида правильно. Однако вскоре возникла одна проблема:

http://oi39.tinypic.com/2s846jo.jpg

У меня был вид изображения внутри подкласса. Так как прямоугольник представления изображения был автоматически размещен с объектами NSLayoutConstraint, я создаю четыре выхода NSLayoutConstraint для настройки их значений. Я не часто меняю ограничения макета. На самом деле, поскольку размер изображения остался неизменным, я бы не стал их устанавливать.

Вот ситуация, когда в подклассе не щелкали (казалось, нормально):

http://oi42.tinypic.com/2urqcmf.jpg

Затем нажмите на изображение (кольцо фокусировки сгенерировано, но...):

http://oi40.tinypic.com/33ldtfa.jpg

И я попытался изменить размер окна, все стало еще более печально "смешно":

http://oi43.tinypic.com/25pshub.jpg

Я не мог понять, почему проблема или как ее решить. Может ли кто-нибудь помочь мне с этим? Я загрузил мой пример кода здесь: Скачать


Довольно печально, что никто не отвечает на этот вопрос.

Я заметил, что подпредставления также неправильно размещены, когда они были добавлены в это представление -addSubview: а также -setFrame метод.

1 ответ

Действительно поздний ответ, но здесь все равно: ты не звонил [NSGraphicsContext saveGraphicsState] в начале if (_shouldDisplayFocus) { блок.

Ты звонишь [NSGraphicsContext restoreGraphicsState] вытолкнуть графическое состояние из стека, но вы никогда ничего не кладете в стек. Какао использует стек графического состояния для рисования всего, поэтому вы выталкиваете какое-то неизвестное состояние, которое имеет отношение к положению изображения. Если вы хотите добавить стиль кольца фокуса и иметь возможность удалить стиль кольца фокуса, вам нужно сначала сохранить состояние графики, установить стиль кольца фокуса на то, что вы хотите, а затем восстановить состояние графики до того, каким оно было.

Другие вопросы по тегам