2016-06-11 81 views
2

我有一個NSScrollView,這是設置爲:NSScrollView:覆蓋系統顯示設置?

MyNSScrollView.hasHorizontalScroller = YES; 
MyNSScrollView.hasVerticalScroller = YES; 
MyNSScrollView.autohidesScrollers = YES; 
MyNSScrollView.scrollerStyle = NSScrollerStyleOverlay; 

我注意到,當如果沒有觸控板連接到OS X,默認情況下,該NSScrollView會忽略我的設置代碼,並迫使滾動條總是顯示:

Settings

我只能要麼改變我的系統設置爲「當滾動」或設置hasHorizontalScroller等,以NO來隱藏它,而後者將禁用鼠標滾動,這不是我想要的結果。

默認情況下(自動基於鼠標或觸控板)將始終顯示滾動,如果用戶沒有觸控板,即使當內容的大小不超過所述幀大小。但是如果你有一個觸控板,無論滾動顯示與否,它都將是疊加樣式,它高於內容。

2之間的區別在於,「傳統」的風格將佔用的空間在scrollerview。如果您在visiableRect值上進行計算轉換,或者您的內容需要通過約束保持某些縱橫比,那麼這會是一個問題。

有沒有辦法強制隱藏它們而不禁用它們?

+0

我建議你讀什麼你自己寫的。 「它會忽略我在程序中的設置並強制它們始終顯示」=>它是什麼?你的申請?他們是什麼?滾動條? –

+0

有兩個滾動條,水平和垂直,爲什麼我說他們,因爲我沒有提到其他的東西,但這兩個酒吧。如果聽起來不夠清楚,我很抱歉。 –

+0

忽略El Tomato,他最近有點脾氣暴躁。 – Willeke

回答

1

您不清楚在什麼情況下會出現什麼症狀。例如,在該首選項窗格中,「顯示滾動條:」的常規設置是什麼?你想要滾動條的行爲是什麼?始終可見?僅在滾動時顯示?

在任何情況下,我認爲這個問題是,你只是被誤解了什麼autohidesScrollers一樣。將其設置爲true僅意味着當文檔視圖不超過剪輯視圖的邊界(a.k.a.內容視圖)時滾動條被隱藏。那就是如果沒有地方可以滾動,因爲一切都已經顯示出來。

該屬性無關與滾動條可見總是或僅滾動時或什麼的。這是一個系統設置,您無法以編程方式進行覆蓋。所有滾動器在用戶會話中的所有應用程序中表現相同。

+0

默認情況下(自動基於鼠標或觸控板)將始終在用戶沒有觸控板的情況下顯示滾動條,即使內容尺寸未超過框架尺寸。但是如果你有一個觸控板,無論滾動顯示與否,它都將是疊加樣式,它高於內容。 2之間的區別在於「傳統」風格將在滾動視圖中佔用空間。如果您在「visiableRect」值上進行計算,或者您的內容需要通過約束保持某些縱橫比,那麼這會成爲問題。 –

+0

不,我沒有誤解'autohidesScrollers'是什麼。只是在默認的OS X設置下,沒有觸控板的用戶無論滾動還是不滾動都會有滾動條。這就是爲什麼我問這個問題,因爲我認爲它應該「隱藏」滾動條,如果它不需要在那裏。只有在代碼中禁用滾動條時,纔可以完全隱藏僅限鼠標用戶的條形圖,而不需要它們。 –

0

您可以強制整個應用程序通過使用一些低級別的Objective-C的魔法(法混寫)使用疊加滾動條:

#import <Cocoa/Cocoa.h> 
#import <objc/runtime.h> 

static IMP old_preferredScrollerStyle = NULL; 
static NSScrollerStyle new_preferredScrollerStyle(id self, SEL _cmd) { 
    // Always prefer overlay style. 
    return NSScrollerStyleOverlay; 
} 

static IMP old_setScrollerStyle = NULL; 
static void new_setScrollerStyle(id self, SEL _cmd, NSScrollerStyle style) { 
    // Call old implementation but always with overlay style. 
    void(*oldImp)(id self, SEL _cmd, NSScrollerStyle style) 
     = (void(*)(id, SEL, NSScrollerStyle))old_setScrollerStyle; 
    oldImp(self, _cmd, NSScrollerStyleOverlay); 
} 

/// Force the overlay style scrollers for this app. 
@interface NSScrollView (ForceOverlay) 
@end 

@implementation NSScrollView (ForceOverlay) 

+ (void)load 
{ 
    [super load]; 

    // Replace the preferred style. This sets the style for app startup and new NSScroller 
    // and NSScrollView instances. 
    Method originalMethod = class_getClassMethod(
     [NSScroller class], 
     @selector(preferredScrollerStyle) 
    ); 
    old_preferredScrollerStyle = method_setImplementation(
     originalMethod, 
     (IMP)new_preferredScrollerStyle 
    ); 

    // Replace the NSScrollView setter. This prevents the change to the legacy style, for example 
    // when the user switches the system setting. 
    originalMethod = class_getInstanceMethod(
     [NSScrollView class], 
     @selector(setScrollerStyle:) 
    ); 
    old_setScrollerStyle = method_setImplementation(
     originalMethod, 
     (IMP)new_setScrollerStyle 
    ); 
} 

@end