일부 NSView의 일부를 다시 그려야합니다. 뷰의 전체 영역까지 - NSView setNeedDisplay : rect가 필요한 것보다 큰 영역을 다시 그려야합니다.
- (IBAction)onUpdateView:(id)sender
{
NSRect updatedRect = ... // Redraw updated area only.
[self.view setNeedsDisplayInRect:updatedRect];
}
나는이 간단하고 확실한 솔루션을 사용
는 석영 디버그 훨씬 더 큰 영역의 다시 그리기를 강조한다. 문제가 사라 :나는 [NSView의 setNeedsDisplayInRect]의 호출이 다음 실행 루프 사이클로 연기, 또는 경우 단순히 [0 runloop의 runUntilDate을] : 할 것으로 나타났습니다
- (IBAction)onUpdate:(id)sender
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self setNeedsDisplayInRect:updatedRect];
});
}
또는
-(void)mouseUp:(NSEvent*)event
{
NSPoint p = [self convertPoint:[event locationInWindow] fromView:nil];
int size = 100;
[self setNeedsDisplayInRect:NSMakeRect(p.x-size/2, p.y-size/2, size, size)];
}
:
- (IBAction)onUpdateAndRunLoop:(id)sender
{
[self.view setNeedsDisplayInRect:updatedRect];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.0]]; // EEW
}
하지만 setNeedsDisplayInRect 경우 이 이는 mouseDown 핸들러에서 호출되어, 모든이 해커없이 작동
무슨 일이 일어나고 어떻게해야합니까? 이 문제에 대한
고립 된 Xcode 프로젝트는 여기에 있습니다 : http://beta.kalinsky.ru/wtf/testRedraw.tar.gz
다시 그리려는보기에는 사용자 지정 drawRect 메서드가 있습니까? 그렇다면 거기에 모든 것을 그려 넣거나 dirtyRect를 존중합니까? 그 rect에있는 것들만 다시 그립니다. 아니면 그보기가 잘리고 그 화면 밖의 내용도 그려지 는가? – HAS
@HAS : 물론, 내 첫 번째 의심이었습니다. 첨부 된 프로젝트의 drawRect 메소드는 문자 그대로 "[NSBezierPath fillRect : dirtyRect];"입니다. –
답변과 의견에서 아래에 제공된 것보다 더 나은 설명을 찾았습니까? 그리는 경우 텍스트와 투명도가 성능에 중요한 영향을줍니다. –