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

时间:2015-11-11 02:28:17

标签: macos cocoa osx-elcapitan nsscrollview ikimagebrowserview

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

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

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

同样,没有代码可以滚动NSSrcollView或设置contentOffsetscrollToRectscrollToVisibleRect

话虽如此,我已经尝试在图像加载后设置这些值但没有成功。

问题1:有没有人在El Capitan(或可能是任何Mac OS版本)上使用NSScrollViewIKImageBrowserView遇到此问题?

问题2:有没有办法调试为什么会发生这种情况或如何让它自动停止滚动?

解决方案

此解决方案最终为我工作。务必正确连接插座。

·H

@interface WCSScrollView : NSScrollView

@end

的.m

@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

View hierarchy

3 个答案:

答案 0 :(得分:5)

您需要子类化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

<强>的.m

#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

答案 1 :(得分:2)

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

花了一些时间后,我找到了一个对我有用的解决方案!

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

    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;
    }

所以基本上我在NSScrollView中获取ImageBrowserView的框架,调用基础(超级)函数然后再设置框架大小。 必须是一些El Capitan bug,来自Xamarin的ImageKitDemo之前曾经工作过,所以不仅我的代码表现得很奇怪。

希望这也能解决你的问题!

答案 2 :(得分:2)

创可贴是将IKImageBrowserView子类化,并使用不执行任何操作的实现覆盖adjustScroller。这将阻止视图不断导致滚动;但是,我不能说以这种方式覆盖adjustScroller会产生什么样的意外后果。此外,在我的应用程序中,视图仍然最初滚动到底部。

值得一提的是,Apple打算弃用IKImageBrowserView并指示我们NSCollectionView,这更为一般。如果您没有投入特定于IKImageBrowserView的功能,那么您的移植时间可能比寻找此错误的解决方法更好。