2016-06-11 82 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