2010-07-28 6 views
4

Это похоже на такой тривиальный вопрос, который нужно задать, но это некоторое время раздражало меня.Привязка вида документа NSScrollView при изменении размера окна

У меня есть окно, которое содержит свиток. Как правило, представление прокрутки имеет документView, который по вертикали больше, чем просмотр клипа, поэтому вы можете получить вертикальный скроллер, чтобы увидеть весь контент внутри прокрутки.

Когда я изменяю размер окна, я пересчитываю размер содержимого в документеViewView прокрутки (потому что вид прокрутки может стать тоньше, что может привести к увеличению роста documentView). Однако побочный эффект заключается в том, что при изменении размера окна documentView держит нижний видимый край заподлицо с нижним краем изображения клипа (то есть он гарантирует, что последняя строка текста всегда видна). Это странный эффект, потому что, как правило, окна удерживают верхний видимый край изображения документа заподлицо с верхним краем изображения клипа (то есть самая верхняя строка текста в представлении документа остается прикрепленной к вершине).

Итак, моя первоначальная мысль исправить эту проблему состояла только в том, чтобы реализовать windowDidResize: или windowWillResize: toSize: уведомление, отметить дельта между высотой старого окна и новой высотой, а затем просто прокрутить прокрутку чтобы сохранить верхнюю строку прокрутки, прикрепленной к вершине.

Однако по какой-то причине это не работает. Это почти работает, но некоторые дельта делятся на пиксель, и если вы достаточно быстро изменяете размер окна, оно иногда составляет ~ 10 пикселей. Таким образом, эффект заключается в том, что верхняя строка вида прокрутки почти прикреплена к верхней части, но не совсем, и это отвлекает.

Есть ли лучший способ сделать это? Вот соответствующий код:

- (void)windowDidResize:(NSNotification *)notification; 
{ 
    if ([notification object] == mainWindow) { 
     CGFloat currentWindowHeight = [mainWindow frame].size.height; 

     // previousWindowHeight is an ivar 
     NSNumber *heightDeltaNum = [NSNumber numberWithFloat:(currentWindowHeight - previousWindowHeight)]; 
     previousWindowHeight = currentWindowHeight; 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"AFSnapScrollView" object:heightDeltaNum]; 
    } 
} 

- (void)snapScrollViewNotification:(NSNotification *)theNotification; 
{ 
    [self snapScrollView]; 

    NSNumber *heightDeltaNum = [theNotification object]; 

    CGFloat newY = [[tagScrollView documentView] visibleRect].origin.y - [heightDeltaNum floatValue]; 
    NSPoint pointToScroll = NSMakePoint(0,newY); 
    [[tagScrollView documentView] scrollPoint:pointToScroll]; 
} 

- (void)snapScrollView; 
{ 

    [...] 

    // adjust the view frame 
    [[tagScrollView documentView] setFrame:NSMakeRect(0, 0, existingDocumentFrame.size.width, newDocumentViewHeight)]; 

    [...] 

} 
+0

Смотрите также http://stackoverflow.com/questions/2384014/nsscrollview-scroll-downward-when-resizing – charles

ответ

10

Ваш вид документа должен переопределить метод - (BOOL) isFlipped и вернуть YES.

+0

Хм, не понял, что пораженное поведение взглядов прокрутки. Работает отлично, делает именно то, что я хочу (как только я модифицировал части метода snapScrollView, чтобы настроить для перевернутых координат). Огромное спасибо! –

0

поворот клипа не нужно изменять documentView, после флип координат.

@interface FlippedClipView : NSClipView 
@end 

@implementation FlippedClipView 
- (BOOL)isFlipped 
{ 
    return YES; 
} 
@end 
Смежные вопросы