2016-06-11 4 views
2

내가 설정 한 NSScrollView이 있습니다NSScrollView : 시스템 디스플레이 설정을 재정의 하시겠습니까?

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

내가 눈치가이 OS X에 연결에는 트랙 패드가 없다, 그리고 경우 기본적으로 NSScrollView 코드 내 설정을 무시하고 강제로 할 때 스크롤러는 항상 표시 :

Settings

난 단지 중 하나 내 시스템의 설정을 변경할 수 있습니다에 " 스크롤"로 등 또는 hasHorizontalScroller 설정을 숨기면 나중에 원하는 결과가 아닌 마우스 스크롤이 비활성화됩니다.

기본적으로 콘텐츠 크기가 프레임 크기를 초과하지 않는 경우에도 사용자가 트랙 패드가없는 경우 스크롤러가 항상 표시됩니다 (마우스 또는 트랙 패드에 자동으로 기반 함). 그러나 트랙 패드가있는 경우 스크롤러가 표시되는지 여부에 관계없이 내용 위에 오버레이 스타일로 표시됩니다.

2의 차이점은 "기존"스타일이 scrollerview에서 공백을 차지한다는 것입니다. 계산을 위해 visiableRect 값을 중계하거나 콘텐츠가 제약 조건을 통해 특정 종횡비로 유지되어야하는 경우 문제가 될 수 있습니다.

비활성화하지 않고 강제로 숨길 수있는 방법이 있습니까?

+0

나는 당신이 당신 자신을 위해 쓴 것을 읽는 것이 좋습니다. "프로그램에서 내 설정을 무시하고 항상 강제로 표시합니다."=> 무엇입니까? 너의 어플리케이션? 그들은 무엇인가? 스크롤 막대? –

+0

가로 세로 2 개의 스크롤러 막대가 있는데 왜 내가 다른 것들은 언급하지 않았지만 2 개의 막대 만 언급 했으므로 말했습니다. 충분히 명확하게 들리지 않으면 유감입니다. –

+0

엘 토마토를 무시하고 요즘 조금 심술 궂습니다. – Willeke

답변

1

어떤 상황에서 어떤 증상이 발생했는지 정확히 알 수 없습니다. 예를 들어, 환경 설정 창에서 "스크롤 막대보기 :"에 대한 일반적인 설정은 무엇입니까? 스크롤러의 행동을 어떻게하고 싶니? 항상 볼 수 있습니까? 스크롤 할 때만 표시합니까?

어쨌든 나는 문제는 당신이 단지 autohidesScrollers이 오해하고 있다는 것입니다. true로 설정하면 문서 뷰가 클립 뷰 (a.k.a.content 뷰)의 경계를 넘어 확장되지 않을 때 스크롤러가 숨겨 짐을 의미합니다. 모든 것이 이미 보여지기 때문에 스크롤 할 수있는 곳이없는 것입니다.

이 속성은 항상 볼 수있는 스크롤러와는 아무런 관련이 없으며 스크롤 할 때만 사용할 수 있습니다. 이는 프로그래밍 방식으로 재정의 할 수없는 시스템 설정입니다. 모든 스크롤러는 사용자 세션의 모든 앱에서 동일하게 작동합니다.

+0

기본적으로 (마우스 또는 트랙 패드에 자동으로 기반 함) 콘텐츠 크기가 프레임 크기를 초과하지 않는 경우에도 사용자가 트랙 패드가없는 경우 항상 스크롤러를 표시합니다. 그러나 트랙 패드가있는 경우 스크롤러가 표시되는지 여부에 관계없이 내용 위에 오버레이 스타일로 표시됩니다. 2의 차이는 "레거시"스타일이 scrollerview에서 공백을 차지한다는 것입니다. 계산을 위해 'visiableRect'값을 중계하거나 콘텐츠가 제약 조건을 통해 특정 종횡비로 유지되어야하는 경우 문제가 될 수 있습니다. –

+0

그리고 나는 autohidesScrollers가 무엇을위한 것인지 오해하지 않았다. 기본적으로 OS X 설정에 따라 트랙 패드가없는 사용자는 스크롤 가능 여부와 관계없이 항상 스크롤러를 갖게됩니다. 그것이 내가이 질문을하는 이유입니다. 스크롤러가있을 필요가 없다면 스크롤러를 "숨겨"야한다고 기대했기 때문입니다. 코드에서 스크롤러를 사용 중지하면 마우스 전용 사용자의 막대가 필요없는 경우이를 숨길 수 있습니다. –

0

당신은 몇 가지 낮은 수준의 목표 - 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 
관련 문제