вертикальный тумблер iPhone - PullRequest
3 голосов
/ 14 мая 2010

Я пытаюсь создать элемент управления вертикальным тумблером для iPhone (по аналогии с UISwitch, но с вертикальным скольжением).

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

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

Любое направление высоко ценится.

Ответы [ 3 ]

1 голос
/ 14 мая 2010

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

Подкласс UIButton, добавьте состояние переключателя, обмен изображениями и т. Д., Используйте при необходимости.

РЕДАКТИРОВАТЬ - Другой путь - полностью настраиваемый элемент управления. Вы создаете подкласс UIControl и добавляете функции, подобные функции UISwitch (т.е. initWithFrame, on, setOn: animated :).

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

[self sendActionsForControlEvents: UIControlEventValueChanged];

Вы реализует beginTrackingWithTouch, continueTrackingWithTouch и endTrackingWithTouch для скольжения изображений переключателя при перемещении касания по переключателю. Я сделал это, чтобы создать 2D слайдер. UISwitch также выполняет свою собственную локализацию, например, значение ON / OFF изменяется на 0/1.

0 голосов
/ 20 июля 2010

Я использовал пользовательский слайдер и установил преобразование. В селекторе у меня был простой оператор if, чтобы привязать его к 100, если больше 50, и к 0, если меньше. Я нашел специальный код слайда онлайн здесь: http://www.iphonedevsdk.com/forum/iphone-sdk-development/11470-there-way-i-can-use-slide-unlock-slider.html

- (void)create_Custom_UISlider
{
CGRect frame = CGRectMake(100.0, 110.0, 180, 1.0    );
    CGRect thumb = CGRectMake(100.0, 110.0, 1.0, 1.0);
    customSlider = [[UISlider alloc] initWithFrame:frame];
    [customSlider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
    // in case the parent view draws with a custom color or gradient, use a transparent color
    customSlider.backgroundColor = [UIColor clearColor];
    customSlider.opaque = 20.0;
    UIImage *stetchLeftTrack = [[UIImage imageNamed:@"image3.png"]
                                stretchableImageWithLeftCapWidth:0.0 topCapHeight:0.0];
    UIImage *stetchRightTrack = [[UIImage imageNamed:@"image2.png"]
                                 stretchableImageWithLeftCapWidth:0.0 topCapHeight:0.0];
    [customSlider setThumbImage:    [UIImageimageNamed:@"image1.png"]forState:UIControlStateNormal];
    [customSlider setMinimumTrackImage:stetchLeftTrack forState:UIControlStateNormal];
    [customSlider setMaximumTrackImage:stetchRightTrack forState:UIControlStateNormal];
    [customSlider thumbRectForBounds: thumb trackRect: frame value: customSlider.value];
    customSlider.minimumValue = 0.0;
    customSlider.maximumValue = 100.0;
    customSlider.continuous = NO;
    customSlider.value = 50.0;
    customSlider.transform = CGAffineTransformRotate(customSlider.transform,270.0/180*M_PI);
}

-(void)sliderAction:(id)sender 
{
    UISlider *slider = (UISlider *)sender;
    int progressAsInt = (int)(slider.value + 0.5f);
    customSliderValue = [NSNumber numberWithInt:0];

    customSliderValue = progressAsInt;

    if (customSliderValue > 50) {
        [self myMethod1];
        [customSlider setValue:100];

    }
    else {
        [self myMethod2];
        [customSlider setValue:0];
    }



}
0 голосов
/ 14 мая 2010

В конкретном случае UISlider вы можете просто извлечь из него и переопределить несколько методов выбора:

// lets a subclass lay out the track and thumb as needed
- (CGRect)minimumValueImageRectForBounds:(CGRect)bounds;
- (CGRect)maximumValueImageRectForBounds:(CGRect)bounds;
- (CGRect)trackRectForBounds:(CGRect)bounds;
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value;

Реализация по умолчанию в основном перемещает большой палец по горизонтали в зависимости от значения в последнем вызове. Если вы двигаете его вертикально, у вас есть вертикальный слайдер. Просто установите все изображения на свои собственные рисунки и реализуйте эти методы, чтобы расположить вещи по желанию. Ваш метод thumbRect получит строку, которая выглядит примерно так:

result.origin.y = trackFrame.origin.y + ( trackFrame.size.height - thumbFrame.size.height ) * value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...