Изображение пользовательской ручки NSSlider

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

Надеюсь, на этот раз мы сможем собрать идеи в одном месте.

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

У меня самого нет решения, и я искал то же самое.

Моя проблема (и вся проблема) в том, что у меня есть изображение для моей ручки размером 22x30px.

У меня есть подкласс NSSliderCell, в котором метод drawKnob::

- (void)drawKnob:(NSRect)knobRect {

NSImage *image = [NSImage imageNamed:@"sliderImage"];

[[NSColor colorWithPatternImage:image] set];
NSRectFill(knobRect);
}

который заполняет старую ручку моим изображением. Затем изменил RectFill на:

NSRectFill(NSMakeRect(knobRect.origin.x,knobRect.origin.y,25,35));

25/35 просто чтобы получить большие значения.

Но размер не изменит ширину (в моем случае это вертикальный ползунок), и изображение не начинается в реальном углу. Размещается посередине ручки, часть левой стороны обрезана, справа сдвоена.

При инициализации NSSlider рамка достаточно велика, чтобы вместить изображение, но не отображается должным образом.

Я попробовал подкласс NSSlider, в котором я использовал -(void)sizeToFit {}, но я действительно не знал, что там установить.

Я надеюсь, что мы сможем опубликовать здесь один пример кода NSSlider с пользовательским изображением ручки, который каждый может использовать и не должен гуглить в течение 2-3 часов.

Я уверен, что кто-то сделал слайдер с пользовательским изображением

Спасибо


person bennibeef    schedule 19.10.2013    source источник


Ответы (1)


В вашем подклассе NSSliderCell вам также необходимо переопределить knobRectFlipped:. Вот мой код, где mNormalKnob — это NSImage, загруженный в переменную-член в initWithCoder:.

- (NSRect)knobRectFlipped:(BOOL)flipped
{
    NSSlider* theSlider = (NSSlider*) [self controlView];
    NSRect myBounds = [theSlider bounds];
    NSSize knobSize = [mNormalKnob size];
    float travelLength = myBounds.size.width - knobSize.width;
    double valueFrac = ([theSlider doubleValue] - [theSlider minValue]) /
        ([theSlider maxValue] - [theSlider minValue]);
    float knobLeft = roundf( valueFrac * travelLength );
    float knobMinY = roundf( myBounds.origin.y +
        0.5f * (myBounds.size.height - knobSize.height) );
    NSRect knobRect = NSMakeRect( knobLeft, knobMinY,
        knobSize.width, knobSize.height );
    return knobRect;
}

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

Вот еще один подход, который должен работать независимо от высоты рамки просмотра, хотя я его не пробовал. Назначьте ползунок и его суперпредставление как имеющие слои Core Animation. Сделайте CALayer в качестве переменной-члена вашего подкласса и установите его содержимое в изображение ручки. Затем, когда пришло время нарисовать ручку, просто отрегулируйте положение слоя с ручкой.

person JWWalker    schedule 19.10.2013