Как UISlider iOS оценивает свою позицию?

Это линейно или логарифмически? Я спрашиваю, потому что я беру исследование, направленное на мобильные приложения, и мы используем iPhone Sam's Teach Yourself (2-е издание, также, буоооооо!). В час 8, если он у кого-то есть, мы создаем анимацию и используем ползунок, чтобы определить, сколько времени потребуется анимации для прохождения цикла. Затем мы должны сделать опцию ручного ввода количества петель в секунду. У меня есть оба варианта, и ползунок изменился на то, что было введено вручную, но единственная проблема, которую я вижу, заключается в том, что когда я ввожу значение вручную, оно будет циклически проходить через правильное количество циклов и перемещать ползунок в правильное позиционирование, но всякий раз, когда я устанавливаю скорость анимации с помощью ползунка, кажется, что значения оцениваются логарифмически, а не линейно. У меня есть диапазон от 0,05 до 19,95 для ползунка, поэтому он начинается с 0,05 и не получает значение «1» до тех пор, пока не пройдут 4/5 пути, затем это от 1-20 остальной части путь, и у вас в значительной степени нет точности на том, какое число вы получите.

Спасибо за ваше время, если вам нужно что-то перефразировать, дайте мне знать!


* Редакция


Хорошо, поехали.

ImageHopViewController.h:

#import <UIKit/UIKit.h>

@interface ImageHopViewController : UIViewController {
    IBOutlet UIImageView *images;
    IBOutlet UILabel *hps;
    IBOutlet UISlider *slider;
    IBOutlet UIButton *toggle;
    IBOutlet UITextField *manual;
    IBOutlet UIButton *go;
}

@property(retain, nonatomic) UIImageView *images;
@property(retain, nonatomic) UILabel *hps;
@property(retain, nonatomic) UISlider *slider;
@property(retain, nonatomic) UIButton *toggle;
@property(retain, nonatomic) UITextField *manual;
@property(retain, nonatomic) UIButton *go;

-(IBAction)toggleAnimation:(id)sender;
-(IBAction)setSpeed:(id)sender;
-(IBAction)manualEntry:(id)sender;

@end

ImageHopViewController.m:

#import "ImageHopViewController.h"

#import "ImageHopViewController.h"

@implementation ImageHopViewController

@synthesize images;
@synthesize hps;
@synthesize slider;
@synthesize toggle;
@synthesize manual;
@synthesize go;

-(IBAction)toggleAnimation:(id)sender{
    if(images.isAnimating) {
        [images stopAnimating];
        [toggle setTitle:@"Begin!" forState:UIControlStateNormal];
    }else{
        [images startAnimating];
        [toggle setTitle:@"Desist!" forState:UIControlStateNormal];
    }
}

-(IBAction)setSpeed:(id)sender {
    NSString *hopRate;
    images.animationDuration=20-slider.value;
    [images startAnimating];
    [toggle setTitle:@"Desist!" forState:UIControlStateNormal];
    hopRate=[[NSString alloc] initWithFormat:@"%1.2f", 1/(20-slider.value)];
    hps.text=hopRate;
    [hopRate release];
}

-(IBAction)manualEntry:(id)sender{
    NSString *hopRate;
    NSString *manualValue;
    float value;
    manualValue=manual.text;
    value=[manualValue floatValue];
    slider.value=value;
    images.animationDuration=1/slider.value;
    [images startAnimating];
    [toggle setTitle:@"Desist!" forState:UIControlStateNormal];
    hopRate=[[NSString alloc] initWithFormat:@"%1.2f", 1/(20-slider.value)];
    hps.text=manualValue;
    [hopRate release];
}

- (void)dealloc
{
    [images dealloc];
    [hps dealloc];
    [slider dealloc];
    [toggle dealloc];
    [manual dealloc];
    [go dealloc];
    [super dealloc];
}

- (void)didReceiveMemoryWarning
{    
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

- (void)viewDidLoad
{
    NSArray *animation;
    animation=[[NSArray alloc] initWithObjects:
               [UIImage imageNamed:@"frame-1.png"],
               [UIImage imageNamed:@"frame-2.png"],
               [UIImage imageNamed:@"frame-3.png"],
               [UIImage imageNamed:@"frame-4.png"],
               [UIImage imageNamed:@"frame-5.png"],
               [UIImage imageNamed:@"frame-6.png"],
               [UIImage imageNamed:@"frame-7.png"],
               [UIImage imageNamed:@"frame-8.png"],
               [UIImage imageNamed:@"frame-9.png"],
               [UIImage imageNamed:@"frame-10.png"],
               [UIImage imageNamed:@"frame-11.png"],
               [UIImage imageNamed:@"frame-12.png"],
               [UIImage imageNamed:@"frame-13.png"],
               [UIImage imageNamed:@"frame-14.png"],
               [UIImage imageNamed:@"frame-15.png"],
               [UIImage imageNamed:@"frame-16.png"],
               [UIImage imageNamed:@"frame-17.png"],
               [UIImage imageNamed:@"frame-18.png"],
               [UIImage imageNamed:@"frame-19.png"],
               [UIImage imageNamed:@"frame-20.png"],
               nil
               ];
    images.animationImages=animation;
    images.animationDuration=10;
    [animation release];
    [super viewDidLoad];
}


- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{
    // Return YES for supported orientations
    return YES;
}

@end

В файле NIB есть только UIImageView (изображения), UISlider (ползунок) для скорости анимации, UILabel (hps) для отображения скачков в секунду, UIButton (переключатель) для переключения анимации, UITextField (вручную) для ручного управления. запись и еще один UIButton (перейти), чтобы начать анимацию с введенным текстом, преобразованным в float.

Поскольку у меня есть (id) для получаемого типа объекта, повлияет ли это на него в любом случае? Я все еще новичок в этом, как мне исправить это?


person JustLikeThat    schedule 29.09.2011    source источник
comment
Вы используете значения с плавающей запятой? Вы должны быть. И почему бы вам не использовать ползунок для ручного ввода? Может, я тебя неправильно понимаю. Не могли бы вы опубликовать для нас образец кода?   -  person W Dyson    schedule 30.09.2011
comment
Я использую значения с плавающей запятой, и единственная причина, по которой я добавляю ручной ввод, заключается в том, что это для домашней работы и является требованием проблемы :)   -  person JustLikeThat    schedule 30.09.2011
comment
Исправлено, пока не удалось добавить ответ, но animationDuration внутри setSpeed нужно было изменить на images.animationDuration=1/slider.value;, а поплавок, вставленный в hopRate в setSpeed, нужно было изменить только на slider.value вместо 1/(20-slider.value)];   -  person JustLikeThat    schedule 30.09.2011


Ответы (3)


UISlider является линейным между его minimumValue (слева) и maximumValue (справа).

Вы можете проверить свойство continuous, чтобы узнать, не виноват ли он:

непрерывный

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

@property(nonatomic, getter=isContinuous) BOOL continuous

Обсуждение

Если YES, ползунок непрерывно отправляет события обновления методу действия связанной цели. Если NO, ползунок отправляет событие действия только тогда, когда пользователь отпускает ползунок ползунка, чтобы установить окончательное значение.

Значение этого свойства по умолчанию - YES.

person PengOne    schedule 30.09.2011
comment
У меня не выбрана непрерывная кнопка, надо было упомянуть об этом раньше! - person JustLikeThat; 30.09.2011
comment
@JustLikeThat: Затем обновите свой вопрос фрагментом кода, в котором вы устанавливаете значения ползунка. Проблема, скорее всего, в этом. - person PengOne; 30.09.2011

UISlider определенно линейный. Быстрый метод действия NSLog должен показать это (NSLog(@"Slider value %f", sender.value);).

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

person Kenny Winker    schedule 30.09.2011
comment
@JustLikeThat, вы могли бы делать это без всякого намерения. Например. если вы не указали свои методы в заголовке правильно. Отсутствие объявления метода означает, что типом возвращаемого значения автоматически считается id. Есть и другие способы, но это самый распространенный случай непреднамеренного приведения типов, с которым я сталкивался. - person Kenny Winker; 30.09.2011


*Решение


Хорошо, animationDuration внутри setSpeed нужно было изменить на images.animationDuration=1/slider.value;, а float, вставленный в hopRate в setSpeed, нужно было изменить только на slider.value вместо 1/(20-slider.value)];.

person JustLikeThat    schedule 30.09.2011