2013-12-24 1 views
1

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

Я могу отобразить карту с правильными положениями плитки и прокручивать ее с помощью баров/жестов. Однако, когда я включаю увеличение, чтобы иметь возможность масштабирования, происходит следующее: enter image description here Как-то я предполагаю, что авто-макет добавляет границы плитки ниже, и я не знаю, как их отключить. Это, конечно, границы, так как я проверял тысячи раз, что мои плитки и подвалы одинакового размера .. так откуда это происходит? У меня довольно много опыта разработки 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++; 
     } 
    } 
} 
+0

Это действительно похоже на артефакт рисунка, в отличие от «границы», которая намеренно нарисована. В зависимости от уровня масштабирования вам может потребоваться сделать немного более крупное изображение, чтобы убедиться, что округление пикселей не заставляет вас попросить нарисовать немного меньшие изображения, чем необходимо, чтобы нарисовать нужную область. – gaige

+0

Моя проблема: вся эта вещь должна быть масштабируемой (рабочей). Если я использую только уровень масштабирования 1 и выключу Magnification, я не вижу линий. Они появляются только после увеличения. – Cutetare

ответ

5

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

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

Update: Этот пример поможет вам и работает: http://bill.dudney.net/roller/objc/entry/catiledlayer_example

+0

Я пришел к выводу, что CATiledLayer, вероятно, является хорошим подходом к моей проблеме, но я просто не могу заставить его работать (в основном из-за увеличения), и на самом деле не нашел хороший пример кода. .. Единственный пример, предоставленный Apple для UIScrollView (PhotoScroller), и мне нужен он для Mac OSX ... Может быть, вы поможете мне преобразовать этот проект? – Cutetare

+0

@Cutetare Это сообщение в блоге должно быть запущено, в комплекте с образцом проекта: http://bill.dudney.net/roller/objc/entry/catiledlayer_example –

+0

В этом примере масштабирование не работает (поверьте, я 've нашел/играл с ним уже: P) – Cutetare

0

Как быстро обойти без использования CATiledLayer вы можете сшить все изображения как одно изображение и добавить его в главном окне

Ниже приведен пример кода сшить 2 изображения:

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(); 

и непосредственно добавить newImage прошиты все ваши плиточный I магов к основному виду.

+0

Этот вопрос предназначен для Mac OS X AppKit. Нет UIImage;) – Cutetare

+0

вы можете попробовать эту ссылку http://stackoverflow.com/questions/6541764/using-nsimageview-to-display-multiple-images-in-quick-sucession – venkat530

+0

Будет ли этот подход вашей поддержки масштабироваться? Как бы реализовать масштаб для этого? – Cutetare

 Смежные вопросы

  • Нет связанных вопросов^_^