Подвид подкласса 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]
вытолкнуть графическое состояние из стека, но вы никогда ничего не кладете в стек. Какао использует стек графического состояния для рисования всего, поэтому вы выталкиваете какое-то неизвестное состояние, которое имеет отношение к положению изображения. Если вы хотите добавить стиль кольца фокуса и иметь возможность удалить стиль кольца фокуса, вам нужно сначала сохранить состояние графики, установить стиль кольца фокуса на то, что вы хотите, а затем восстановить состояние графики до того, каким оно было.