3

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

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

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

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

话虽如此,我尝试在图像加载失败后设置这些值。

问题 1:有没有人使用El Capitan(或任何 Mac OS 版本)NSScrollView或在 El Capitan 上经历过这种情况?IKImageBrowserView

问题 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

查看层次结构

4

3 回答 3

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
于 2016-12-01T11:53:48.280 回答
2

创可贴是用一个什么都不做的实现来继承IKImageBrowserView和覆盖。adjustScroller这将阻止视图不断引起滚动;但是,我不能说adjustScroller以这种方式压倒一切的意外后果可能会产生什么。此外,在我的应用程序中,视图最初仍滚动到底部。

值得一提的是,Apple 打算弃用IKImageBrowserView并指示我们使用NSCollectionView,这是更笼统的。如果您没有投资于特定于IKImageBrowserView.

于 2016-09-14T08:01:43.997 回答
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 错误,Xamarin 的 ImageKitDemo 以前可以工作,所以这不仅仅是我的代码行为异常。

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

于 2015-11-15T15:07:11.210 回答