2008-11-20 4 views
1

Я пытаюсь создать собственный подкласс NSScroller. Я создал класс и задал его как вертикальный скроллер на NSScrollView в IB. Когда я запускаю свой проект, метод drawRect: вызывается для моего подкласса, поэтому я знаю, что он правильно подключен.Как я могу сделать свой подкласс NSScroller другой шириной?

Теперь, как мне изменить ширину моего модного нового NSScroller? Независимо от того, что я делаю с его границами и рамкой, он всегда хочет рисовать прямоугольник шириной 15 пикселей (размер стандартного NSScroller).

ответ

2

В вашем NSScroller подкласса, вы должны переопределить scrollerWidth:

+(CGFloat)scrollerWidth 
{ 
    return 30.0; 
} 

Это значение, которое NSScrollView использует для определения кадра для вашего компонента, когда он устанавливает его.

+0

Я попытался переопределить этот метод, но проблема заключается в том, что NSScrollview всегда вызывает этот метод класса на NSScroller, вместо мой пользовательский подкласс. В NSScrollView есть переменная _verticalScrollerClass, которая может быть изменена, но переопределение частных переменных не поддерживается. –

+0

Хм ... это может случиться, потому что он становится архивированным IB при этом (оригинальном) размере. Пробовали ли вы программно определить, помогает ли это? –

+0

У меня есть. Все, что я прочитал, говорит о том, что переопределение этого частного ивара - единственный путь. В итоге я просто создал свой собственный образ для дублирования функций прокрутки и скрыл по умолчанию прокрутку. –

1

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

Например. В NSScroller-MyScroller.h:

#import <Cocoa/Cocoa.h> 

@interface NSScroller (MyScroller) 

+ (CGFloat)scrollerWidth; 
+ (CGFloat)scrollerWidthForControlSize: (NSControlSize)controlSize; 

@end 

В NSScroller-MyScroller.m:

#import "NSScroller-MyScroller.h" 
#define SCROLLER_WIDTH 30.0 

@implementation NSScroller (MyScroller) 

+ (CGFloat)scrollerWidth { 
    return SCROLLER_WIDTH; 
} 

+ (CGFloat)scrollerWidthForControlSize: (NSControlSize)controlSize { 
    return SCROLLER_WIDTH; 
} 

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