Плитки NSImageView внутри NSScrollView рисуют нежелательные границы при уменьшении

У меня есть NSScrollView, чей documentView представляет собой огромный NSView, состоящий из множества суб-NSImageView, которые действуют как плитки на карте. (Вся карта - это NSView, и, поскольку она намного больше, чем размер экрана, она встроена в scrollview).

Я могу отображать карту с правильным расположением плиток и прокручивать ее с помощью полос / жестов. Однако ... когда я включаю увеличение, чтобы можно было масштабировать, происходит следующее: введите здесь описание изображенияКаким-то образом я ' m предполагая, что автоматическая компоновка добавляет границы плитки ниже, и я не знаю, как их отключить. Это определенно границы, так как я тысячи раз проверял, что мои плитки и вложенные представления имеют одинаковый размер ... так откуда это? У меня есть некоторый опыт разработки для iOS, но я полностью потерялся с NSScrollView (где мои методы делегата?). Как отключить такое поведение при просмотре прокрутки?

Вот мой код подпредставления:

- (void)setupSubViews
{
  NSLog(@"--------Creating subviews!-------");
    //first we create the subviews..
    //This is the key part, we traverse from top Left, and since OS X coordinates start at bottom left, we need to invert the rows!
    for (int i=0; i< NUMBER_OF_COLUMNS; i++) {
        for (int j=NUMBER_OF_ROWS-1; j>=0; j--) {
            CGRect frame = CGRectMake(i*256, j*256, 256, 256);
            NSImageView *newView = [[NSImageView alloc] initWithFrame:frame];
            newView.focusRingType = NSFocusRingTypeNone; //I gave this focusRing a try, it didn't work :(

            [self addSubview:newView];
        }
    }

}

И здесь я соединяю подвиды с фактическими изображениями ..

-(void)updateMap:(id)tilesPassed{

    if (downloadFinished) {
        NSLog(@"--------DRAW RECT-------------");
        NSImageView *subView;
        NSInteger idx = 0;

        for (int i =0; i<[self.subviews count]; i++) {
            subView = [self.subviews objectAtIndex:i];
            [subView setAllowsCutCopyPaste:NO];
            [subView setImageFrameStyle:NSImageFrameNone]; //This doesnt work either :(

            MapTile *tile = [tilesArray objectAtIndex:idx];
            subView.image = tile.image;

            idx++;
        }
    }
}

person Cutetare    schedule 24.12.2013    source источник
comment
Это действительно похоже на артефакт рисования, а не на намеренно нарисованную границу. В зависимости от вашего уровня масштабирования вам может потребоваться сделать изображение немного большего размера, чтобы убедиться, что округление пикселей не заставляет вас рисовать изображения немного меньшего размера, чем необходимо для рисования правильной области.   -  person gaige    schedule 24.12.2013
comment
Моя проблема: все это должно быть масштабируемым (работающим). Если я использую только уровень масштабирования 1 и отключу увеличение, я не вижу линий. Они появляются только после того, как я увеличиваю масштаб ..   -  person Cutetare    schedule 25.12.2013


Ответы (2)


Вероятно, вы не захотите использовать для этого подпредставления. Именно для этой цели существует подкласс CALayer: CATiledLayer: https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html

С его помощью вы даже можете загружать различные плитки изображений в зависимости от того, насколько вы увеличены, как в Google Maps. Он будет отображаться без границ, и производительность будет НАМНОГО лучше, чем при использовании множества подвидов. Подпредставления дороги, слои (как правило) дешевы.

Обновление. Этот пример поможет вам начать работу: http://bill.dudney.net/roller/objc/entry/catiledlayer_example

person Johannes Fahrenkrug    schedule 01.01.2014
comment
Я пришел к выводу, что CATiledLayer, вероятно, хороший подход к моей проблеме, но я просто не могу заставить его работать (в основном из-за увеличения), и на самом деле не нашел хорошего образца кода ... Единственный пример предоставленный Apple, предназначен для UIScrollView (PhotoScroller), и он мне нужен для Mac OSX ... Не могли бы вы помочь мне преобразовать этот проект? - person Cutetare; 02.01.2014
comment
@Cutetare Это сообщение в блоге должно помочь вам начать работу, в комплекте с примером проекта: законопроект. dudney.net/roller/objc/entry/catiledlayer_example - person Johannes Fahrenkrug; 02.01.2014
comment
Zoom в этом примере не работает (поверьте, я уже нашел / играл с ним: P) - person Cutetare; 02.01.2014
comment
@Cutetare Для меня масштабирование увеличивается, когда я нажимаю на него. Возможно, вам придется изменить код для поддержки жестов сжатия и масштабирования. - person Johannes Fahrenkrug; 02.01.2014
comment
Но он всегда приближается к нижнему левому углу, а не к щелчку мыши. И я не могу заставить точку привязки изменяться при каждом щелчке мыши - person Cutetare; 03.01.2014
comment
Я принял ответ, потому что срок вознаграждения истекает, и я действительно считаю, что CATiledLayer - лучший подход (после многих исследований), но если бы вы могли помочь мне с этой реализацией, это было бы здорово :) - person Cutetare; 03.01.2014

В качестве быстрого решения без использования CATiledLayer вы можете объединить все изображения в одно изображение и добавить его в главное представление.

Ниже приведен пример кода для сшивания двух изображений:

UIImage *bottomImage = [UIImage imageNamed:@"bottom.png"]; //first image
UIImage *image       = [UIImage imageNamed:@"top.png"]; //foreground image

CGSize newSize = CGSizeMake(209, 260); //size of image view
UIGraphicsBeginImageContext( newSize );

// drawing 1st image
[bottomImage drawInRect:CGRectMake(0,0,newSize.width/2,newSize.height/2)];

// drawing the 2nd image after the 1st
[image drawInRect:CGRectMake(0,newSize.height/2,newSize.width/2,newSize.height/2)] ;

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

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

person venkat530    schedule 02.01.2014
comment
Это вопрос для Mac OS X AppKit. Нет UIImage;) - person Cutetare; 02.01.2014
comment
вы можете попробовать эту ссылку stackoverflow.com/questions/6541764/ - person venkat530; 02.01.2014
comment
Будет ли этот ваш подход поддерживать масштабирование ?? Как мне реализовать масштабирование для этого? - person Cutetare; 02.01.2014
comment
вместо NSImageView вы можете использовать IKImageView в качестве основного изображения. После того, как все изображение сшито и встроено в IKImageView, вы можете выполнять операции редактирования изображения, такие как поворот, масштабирование и обрезка. - person venkat530; 02.01.2014