2016-07-30 9 views
1

I подклассы NSView, чтобы получить его масштабируемость. Следуя руководству яблок «View Geometry», границы должны растягиваться, чтобы соответствовать рамке. При настройке размера рамки ничего не меняется. Когда я напечатал размер кадра для консоли, я увидел, что setFrameSize делает буквально ничего.Установить масштаб NSView

Итак, здесь мой вопрос: как изменить размер установленного кадра (без установки заданного размера рамки)? (Автоотключение отключено)

class ScaledView : NSView { 
    let scale: CGFloat 
    let element: Drawable 

    required init?(coder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") // not needed, adding it programmatically 
    } 

    init(frame frameRect: NSRect, scale: CGFloat, toDraw element: DoubleValue) { 
     self.scale = scale 
     self.element = element; 
     super.init(frame: frameRect) 
     self.setFrameSize(CGSize(width: self.bounds.size.width * scale, height: self.bounds.size.height * scale)) 
    } 

    override func drawRect(dirtyRect: NSRect) { 
     element.draw(dirtyRect, parent: self) 
    } 
} 

ответ

2

Вы уверены, что не хотите устанавливать границы, а не рамку? Изменение кадра изменит размер представления в его системе координат родителя, тем самым изменив не только масштаб его содержимого, но также его внешний вид в пределах его супервизора. Если вы просто хотите масштабировать содержимое представления, в руководстве «Просмотр геометрии» написано:

Для перевода или масштабирования системы координат вы изменяете прямоугольник границ вида. Изменение прямоугольника границ устанавливает базовую систему координат, с которой начинается весь рисунок, выполняемый представлением. Конкретные подклассы NSView обычно изменяют прямоугольник границ сразу по мере необходимости в их методах initWithFrame: или при загрузке файла nib, который содержит представление.

+0

Дело в том, что я хотел бы нарисовать свой контент на полном размере и уменьшить его, поэтому, хотя я имею меньшую рамку и большие границы. Вот почему я, хотя и изменяю фрейм. Любая идея, как это решить? – Jofkos

+1

Уверен - пусть кадр будет тем, чем он будет (опять же, так как представление появляется на экране и, вероятно, контролируется пользователем или окном или что-то в этом роде), но затем установите свои границы так, как вам хочется. Вы можете установить границы, большие, чем кадр, или меньше, чем кадр, чтобы масштабировать содержимое вашего представления вниз или вверх соответственно. – andyvn22

+0

Спасибо, все. Я не знаю, почему я не думал об этом ... – Jofkos