Macos (Cocoa)带有IKImageBrowserView的NSScrollView滚动至底部

Macos (Cocoa)带有IKImageBrowserView的NSScrollView滚动至底部,macos,cocoa,osx-elcapitan,nsscrollview,ikimagebrowserview,Macos,Cocoa,Osx Elcapitan,Nsscrollview,Ikimagebrowserview,我正在使用IKImageBrowserView显示图像网格。我没有任何代码以编程方式设置点、偏移或滚动任何内容。我只是有一些代码,列出一个充满图像的目录的内容,并在图像浏览器中显示它们 启动应用程序后,滚动视图会无缘无故地滚动到图像网格的底部。在这之后的几秒钟内,如果您尝试用鼠标向上滚动,滚动器会出现故障,仍然尝试滚动到底部。此后,问题停止,用户可以正常滚动 在El Capitan之前,自动滚动没有发生 同样,没有代码滚动NSSrcollView或设置contentOffset,或scrollT

我正在使用
IKImageBrowserView
显示图像网格。我没有任何代码以编程方式设置点、偏移或滚动任何内容。我只是有一些代码,列出一个充满图像的目录的内容,并在图像浏览器中显示它们

启动应用程序后,滚动视图会无缘无故地滚动到图像网格的底部。在这之后的几秒钟内,如果您尝试用鼠标向上滚动,滚动器会出现故障,仍然尝试滚动到底部。此后,问题停止,用户可以正常滚动

在El Capitan之前,自动滚动没有发生

同样,没有代码滚动
NSSrcollView
或设置
contentOffset
,或
scrollToRect
scrollToVisibleRect

尽管如此,我还是尝试在图像加载后设置这些值,但没有成功

问题1:是否有人在El Capitan(或任何Mac OS版本)上使用
NSScrollView
iImageBrowserView
时遇到过这种情况

问题2:是否有任何方法可以调试发生这种情况的原因,或者如何使其自动停止滚动


解决方案 这个解决方案最终对我有效。确保正确连接插座

H M

我遇到了完全相同的问题,但是在一个Xamarin.MAC项目中。我的项目被搁置了几个月,其间有几次Xamarin更新,所以我认为这是一个与Xamarin相关的问题,没有考虑到我所有的Mac都同时升级到El Capitan!所以你让我走上了正确的道路。 起初,我认为Xamarin ImageKitDemo没有受到这个问题的影响,但一旦IKImageBrowserView的高度改变,滚动也开始了。对我的项目进行实验的结果也是一样的:只要高度发生变化(通过编程设置窗口框架或手动调整窗口大小),滚动就开始了

花了一段时间后,我找到了一个真正适合我的解决方案

技巧似乎是将NSScrollView子类化,并覆盖ResizeSubviewsWithOldSize(),如下所示(Xamarin代码,但应该很容易移植到obj-C)

基本上,我在NSScrollView中获取ImageBrowserView的帧,调用base(super)函数,然后设置帧大小。 一定是El Capitan的bug,Xamarin的ImageKitDemo以前也能用,所以这不仅仅是我的代码表现异常


希望这也能解决你的问题

> Po.AdvID是子类<代码> IKIMAGE BuffSerVIEW,并覆盖“代码> > ActudioCurror < /Cord>”,而不执行任何操作。这将阻止视图不断导致滚动;然而,我不能说以这种方式覆盖
调整滚动条
会产生什么意外后果。此外,在我的应用程序中,视图最初仍然滚动到底部


值得一提的是,苹果公司打算反对IKImageBrowserView,并指示我们使用更通用的
NSCollectionView
。如果您没有投入到特定于
IKImageBrowserView
的功能上,那么花在移植上的时间可能比寻找解决此错误的方法要好。

您需要对NSScrollView进行子类化

.h

#import <Cocoa/Cocoa.h>
#import <Quartz/Quartz.h>

// This class fixes a glitch with the
// ikimagebrowserview
// http://stackoverflow.com/questions/33643289/cocoa-nsscrollview-with-ikimagebrowserview-scrolls-to-bottom

@interface IKImageBrowserScrollFixScrollView : NSScrollView

@end

子类NSScrollView,重写所有偏移量更改方法并添加断点。找到解决方案了吗?现在升级到XCode 8后,我的项目出现了这种情况……我最终将
NSScrollView
子类化。我已经用我的解决方案更新了这个问题。你的IBOutlet应该很弱,因为我不理解你的解决方案
@class IKImageBrowserView;

@interface WCSScrollView ()
@property (strong) IBOutlet NSClipView * scrollerClipView;
@property (strong) IBOutlet IKImageBrowserView * imageBrowser;
@end

@implementation WCSScrollView

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];
}

- (void)resizeSubviewsWithOldSize:(NSSize)oldSize {
    NSClipView * clip = self.subviews[0];
    self.imageBrowser = (IKImageBrowserView*)clip.subviews[0];
}

@end
    public override void ResizeSubviewsWithOldSize (System.Drawing.SizeF oldSize)
    {
        NSClipView clip = this.Subviews [0] as NSClipView;
        myIKImageBrowserView vw = clip.Subviews [0] as myIKImageBrowserView;

        RectangleF frame = vw.Frame;
        base.ResizeSubviewsWithOldSize (oldSize);
        vw.Frame = frame;
    }
#import <Cocoa/Cocoa.h>
#import <Quartz/Quartz.h>

// This class fixes a glitch with the
// ikimagebrowserview
// http://stackoverflow.com/questions/33643289/cocoa-nsscrollview-with-ikimagebrowserview-scrolls-to-bottom

@interface IKImageBrowserScrollFixScrollView : NSScrollView

@end
#import "IKImageBrowserScrollFixScrollView.h"

@implementation IKImageBrowserScrollFixScrollView

- (void)resizeSubviewsWithOldSize:(NSSize)oldSize {

    NSClipView * clipView;
    for (NSView * v in self.subviews) {
        if ([v isKindOfClass:[NSClipView class]]) {
            clipView = (NSClipView *)v;
            break;
        }
    }

    IKImageBrowserView * imageBrowser;
    for (NSView * v in clipView.subviews) {
        if ([v isKindOfClass:[IKImageBrowserView class]]) {
            imageBrowser = (IKImageBrowserView *)v;
            break;
        }
    }

    NSRect r = imageBrowser.frame;
    [super resizeSubviewsWithOldSize:oldSize];
    imageBrowser.frame = r;

}

@end