(Какао) NSScrollView с IKImageBrowserView прокручивается вниз

Я использую IKImageBrowserView для отображения сетки изображений. У меня нет кода, который программно устанавливает точки, смещает или прокручивает что-либо. У меня просто есть код, который перечисляет содержимое каталога, полного изображений, и отображает их в браузере изображений.

При запуске приложения прокручиваемый вид прокручивается до нижней части сетки изображений, ничем не спровоцированный. В течение нескольких секунд после этого, если вы попытаетесь прокрутить вверх с помощью мыши, скроллер выйдет из строя и все еще попытается прокрутить вниз. После этого проблема прекращается, и пользователь может нормально прокручивать.

До El Capitan автопрокрутки не было.

Опять же, нет кода, который прокручивает NSSrcollView или устанавливает contentOffset или scrollToRect, scrollToVisibleRect.

С учетом сказанного я безуспешно пытался установить эти значения после загрузки изображений.

Вопрос 1. Кто-нибудь сталкивался с этим при использовании NSScrollView или IKImageBrowserView в El Capitan (или, возможно, в любой версии Mac OS)?

Вопрос 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

Просмотреть иерархию


person WrightsCS    schedule 11.11.2015    source источник
comment
подкласс NSScrollView, переопределить все методы изменения смещения и добавить точки останова   -  person Daniyar    schedule 11.11.2015
comment
Вы нашли решение? Теперь это происходит с моими проектами при обновлении до XCode 8...   -  person Axel Zehden    schedule 17.10.2016
comment
В итоге я создал подкласс NSScrollView. Я обновил вопрос своим решением.   -  person WrightsCS    schedule 17.10.2016
comment
ваш IBOutlet должен быть слабым   -  person Peter Lapisu    schedule 01.12.2016
comment
честно говоря я не понимаю твоего решения   -  person Peter Lapisu    schedule 01.12.2016


Ответы (3)


Вам нужно создать подкласс 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

#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
person Peter Lapisu    schedule 01.12.2016

У меня была точно такая же проблема, но в проекте 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;
    }

Итак, в основном я получаю кадр ImageBrowserView в NSScrollView, вызываю базовую (супер) функцию, а затем возвращаю размер кадра. Должна быть какая-то ошибка El Capitan, ImageKitDemo от Xamarin раньше работал, так что не только мой код вел себя странно.

Надеюсь, это решит и вашу проблему!

person Dirk    schedule 15.11.2015

Помощником является создание подкласса IKImageBrowserView и переопределение adjustScroller реализацией, которая ничего не делает. Это предотвратит постоянную прокрутку представления; однако я не могу сказать, к каким непредвиденным последствиям может привести переопределение adjustScroller таким образом. Кроме того, в моем приложении представление по-прежнему изначально прокручивается вниз.

Стоит отметить, что Apple намерена отказаться от IKImageBrowserView и указывает нам NSCollectionView, что является более общим. Если вы не инвестируете в функциональность, специфичную для IKImageBrowserView, ваше время, вероятно, лучше потратить на перенос, чем на поиск обходного пути для этой ошибки.

person Jamborino    schedule 14.09.2016