2013-06-21 4 views
0

Я хотел создать кольцо фокусировки вне подкласса NSView для определения выбора. Моя ссылка взята здесь: Link.Подвижность подкласса 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

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

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

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


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

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

+0

@ H2CO3 Мне было немного любопытно, почему удалить тег «xcode»? –

+0

, потому что это не вопрос Xcode. Стоит прочитать описание (тег wiki) тега перед его использованием - тег wiki для 'xcode' говорит, что« он не должен использоваться для общих вопросов программирования iOS и OS X ». –

ответ

1

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

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