gpt4 book ai didi

objective-c - NSScrollView:覆盖系统显示设置?

转载 作者:搜寻专家 更新时间:2023-10-30 20:24:28 27 4
gpt4 key购买 nike

我有一个 NSScrollView,它被设置为:

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

我注意到如果没有触控板连接到 OS X,默认情况下,NSScrollView 将忽略我在代码中的设置并强制始终显示滚动条:

Settings

我只能将我的系统设置更改为“滚动时”或将 hasHorizo​​ntalScroller 等设置为 NO 以隐藏它,并且稍后将禁用鼠标滚动,这不是我想要的结果。

默认情况下(自动基于鼠标或触控板)如果用户没有触控板,将始终显示滚动条,即使内容大小不超过框架大小时也是如此。但是如果你有一个触控板,它就会是覆盖样式,无论滚动条显示与否,它都在内容之上。

两者之间的区别在于“传统”样式会占用 ScrollView 中的空间。如果您依赖 visiableRect 值进行计算,或者您的内容需要通过约束保持一定的纵横比,这将是一个问题。

有没有办法在不禁用它们的情况下强制隐藏它们?

最佳答案

您可以通过使用一些低级的 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

关于objective-c - NSScrollView:覆盖系统显示设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37759402/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com