【问题标题】:(Cocoa) NSScrollView with IKImageBrowserView scrolls to bottom(Cocoa) 带有 IKImageBrowserView 的 NSScrollView 滚动到底部
【发布时间】:2015-11-11 02:28:16
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 子类NSScrollView,覆盖所有偏移量改变方法并添加断点
  • 您找到解决方案了吗?现在我的项目正在升级到 XCode 8...
  • 我最终继承了NSScrollView。我已经用我的解决方案更新了问题。
  • 你的 IBOutlet 应该很弱
  • 老实说我不明白你的解决方案

标签: macos cocoa osx-elcapitan nsscrollview ikimagebrowserview


【解决方案1】:

你需要继承 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

【讨论】:

    【解决方案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 以前可以工作,所以不仅仅是我的代码行为异常。

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

    【讨论】:

      【解决方案3】:

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

      值得一提的是,Apple 打算弃用IKImageBrowserView 并指示我们使用更通用的NSCollectionView。如果您没有投资于特定于 IKImageBrowserView 的功能,那么您的时间可能更适合用于移植而不是寻找解决此错误的解决方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-12
        • 2012-01-07
        • 1970-01-01
        相关资源
        最近更新 更多