2013-08-23 3 views
1

Я новичок в программировании Obj-C/Cocoa и столкнулся с проблемой NSImageView.
Моя цель - создать приложение, которое позволит пользователю поместить изображение на него с помощью перетаскивания & drop.NSImageView изменил размер изображения

Проблема заключается в следующем: когда мы отбрасываем изображение, большее, чем окно, оно меняет размер окна до размера изображения, Я не хочу этого!
Я положил NSImageView в NSScrollView так только определенную часть изображения MUST быть показано, и пользователь будет перемещать ползунки для просмотра всего один (или просто изменить размер окна), это то, что я хочу ..

Вот моя XIB иерархия (обеспокоенно часть):

  • Посмотреть
    • NSScrollView
      • Посмотреть
        • NSImageView


В коде моей NSImageView, у меня есть (с этой проблемой):

[self setImageScaling:NSScaleProportionally]; 
[self setImage:newImage]; 


ПРИМЕЧАНИЯ: Ползунки, кажется, переместить вид, а не изображение
Примечания 2: Я не могу изменить размер окна, меньшего размера, чем изображение

+0

Что вы подразумеваете под «ползунками, похоже, перемещают вид, а не образ»? –

+0

Я имею в виду, когда я прокручиваю вверх/вниз, мы видим, что представление движется и автоматически возвращается в позицию по умолчанию. – Val

+0

Хорошо. Я понимаю, в чем проблема. То, что вы описываете, звучит для меня так же, как представление внутри вашего NSScrollView недостаточно велико. Поскольку 'subviews для клипов ', вероятно, не включен, вы все равно можете видеть NSImageView вне его границ. И причина, по которой вы можете прокручивать и возвращаться в исходное положение, - это функция, называемая подпрыгиванием, которая является частью NSScrollView. Не могли бы вы отладить ваше приложение и проверить размеры 'yournsimageview' и' yourscrollview.view'. –

ответ

4

У меня есть ужасное отвращение к СИБ файлов и предпочитают делать что-то программно, когда это возможно, поэтому я не очень помогаю с этим ... но вот небольшой список из небольшого приложения для тестирования NSScrollview, которое я недавно закодировал, что делает что-то подобное. Единственная несамостоятельная вещь, упомянутая в этом фрагменте кода, - это имя window, которое относится к NSWindow * для окна, которое уже было создано. И self здесь просто ссылается на объект контроллера.

NSImage * myImage  = [NSImage imageNamed:@"myfilename.png"]; 
NSRect imageRect  = NSMakeRect(0.0,0.0,myImage.size.width,myImage.size.height); 


self.myImageView  = [[NSImageView alloc] initWithFrame:imageRect]; 
self.myImageView.bounds = imageRect; 
self.myImageView.image = myImage; 

self.myScrollView  = [[NSScrollView alloc] initWithFrame:[window.contentView frame]]; 
self.myScrollView.hasVerticalScroller = YES; 
self.myScrollView.hasHorizontalScroller = YES; 
self.myScrollView.documentView = self.myImageView; 
self.myScrollView.borderType = NSNoBorder; 
self.myScrollView.scrollerStyle = NSScrollerStyleOverlay; 

window.contentView  = self.myScrollView; 

Я знаю, что это, возможно, не решение, которое вы искали, но, возможно, оно помогает вам отлаживать? В частности, я не делал ничего смешного с моим NSImageView, кроме того, давал ему рамку, прямоугольник границ и NSImage *, поэтому я не думаю, что вам нужно беспокоиться о параметре масштабирования как таковой - на самом деле, если вы хотите, чтобы изображение было полноразмерным и чтобы прокручивать его, вы хотите, чтобы ваш фрейм NSImageView был того же размера, что и изображение, чтобы оно не предназначалось для масштабирования. Возможно, это твоя проблема - рамка слишком мала? Это нормально, когда кадр NSImageView больше, чем окно, - вот что позволяет вам прокручивать его.

+0

Спасибо за ваш ответ, но я действительно хотел бы использовать Interface Builder для этой задачи! И с фактическим кодом, который у меня есть, я не уверен, что смогу использовать ваше решение. – Val

+1

Достаточно справедливо в интерфейсе Builder, но, надеюсь, вы понимаете, что это почти минимальный возможный код, необходимый для создания NSScrollView, который делает то, что вы хотите , И это то же самое, что интерфейс Builder делает за кулисами - все настройки и настройки, которые вы делаете в Interface Builder, по сути, просто говорят ему выполнять такой код, когда это приложение запускается. Поэтому, если вы не можете найти способ сделать что-то вроде этой работы с вашим кодом, может быть что-то более фундаментальное в вашем коде. – Matt

+1

Другая причина, по которой я думаю, что вам лучше попробовать код здесь (помимо того, что я не знаю ответа от верхней части головы для Interface Builder) заключается в том, что у IB есть миллион маленьких флажков и настроек похоронен в разных стеклах, и если у вас их нет, все они будут проверены, сняты и выбраны правильно, все может работать не так, как ожидалось. Если кто-то дает вам код, который, как известно, работает, и вы его вставляете, он все равно должен работать - вам не нужно беспокоиться о том, что вы где-то пропустили флажок, который нарушает ваше приложение. – Matt

1

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

  1. Проверьте, достаточно ли NSImageView для отображения полного изображения. (Проверьте рамку или границы для ширины и высоты)

    Если это не достаточно большой, сделать это (внутри метода, в котором установлен новый образ):

    self.myImageView.frame = NSMakeRect(0.0,0.0, self.myImageView.image.size.width, self.myImageView.image.size.height);

  2. Adjust размер вашего соответственно просматривать прокрутки.

    self.myScrollView.view.frame = self.myImageView.frame;

Теперь ваша прокручивать область должна быть достаточно большой, чтобы покрыть полное изображение.

Если это сработает для вас, дайте Мэтту также положительную оценку его ответа, поскольку его ответ делает практически то же самое - только на основе кода вместо инициализации всего, используя файл nib, - и код Я использовал очень похоже на то, что он уже опубликовал.

+0

Большое спасибо, ваш 'myScrollView.view' (забыл использовать« внутренний »вид) работает! И не волнуйтесь, он стартует в StackOverflow, я дам +1 каждому свой ответ здесь, потому что это хорошие ответы тоже :)! – Val

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