我正在使用IKImageBrowserView
来显示图片网格。我没有任何设置点或偏移的代码或以编程方式滚动任何内容。我只是有代码列出了一个充满图像的目录的内容,并在图像浏览器中显示它们。
启动应用程序后,滚动视图会滚动到图像网格的底部,无提示。在此之后的几秒钟内,如果您尝试使用鼠标向上滚动,则滚动条会出现故障并仍尝试滚动到底部。此后,问题停止,用户可以正常滚动。
在El Capitan之前,自动滚动没有发生。
同样,没有代码可以滚动NSSrcollView
或设置contentOffset
或scrollToRect
,scrollToVisibleRect
。
话虽如此,我已经尝试在图像加载后设置这些值但没有成功。
问题1:有没有人在El Capitan(或可能是任何Mac OS版本)上使用NSScrollView
或IKImageBrowserView
遇到此问题?
问题2:有没有办法调试为什么会发生这种情况或如何让它自动停止滚动?
此解决方案最终为我工作。务必正确连接插座。
@interface WCSScrollView : NSScrollView
@end
@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
答案 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
的功能,那么您的移植时间可能比寻找此错误的解决方法更好。