iOS的UISlider如何评估它的位置?

时间:2011-09-29 23:53:01

标签: objective-c ios uislider

是线性还是对数?我问,因为我正在进行移动应用程序定向研究,我们正在使用Sam的自学iPhone(第2版,也是,booooooo!)。在第8小时,如果有人拥有它,我们制作动画,并使用滑块确定动画循环所需的时间。然后我们应该为每秒多少个循环做一个手动输入选项。我已经实现了这两个并将滑块更改为手动输入的内容,但我唯一能看到的问题是,当我手动输入一个值时,它将循环通过正确的循环量并将滑块移动到正确的定位,但每当我用滑块设置动画的速度时,它似乎以对数方式而不是线性地评估值。我的滑块范围为.05 - 19.95,所以它从.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)用于显示“hops”每秒“,一个UIButton(切换)切换动画,一个UITextField(手动)进行手动输入,另一个UIButton(去)开始动画,输入的文本转换为float

因为我有(id)正在接收的对象类型,所以它会影响它吗?我还是新手,所以我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

UISliderminimumValue(左)和maximumValue(右)之间是线性的。

您可能需要检查continuous属性,看看这不是罪魁祸首:

  

连续

     

包含一个布尔值,指示滑块中是否有更改   值生成连续更新事件。

     

@property(nonatomic, getter=isContinuous) BOOL continuous

     

讨论

     

如果YES,滑块会连续向相关联的人发送更新事件   目标的行动方法。如果NO,则滑块仅发送操作事件   当用户释放滑块的拇指控件以设置最终时   值。

     

此属性的默认值为YES

答案 1 :(得分:1)

UISlider绝对是线性的。 一个快速的NSLog in action方法应该显示这个(NSLog(@"Slider value %f", sender.value);)。

随便,我会说你的问题可能是类型转换(无意中将你的浮点转换为int某处)。我必须看到代码来确认或否认这一点。

答案 2 :(得分:1)


*溶液


好的,animationDuration里面的setSpeed需要更改为images.animationDuration=1/slider.value;,而floathopRate插入setSpeed需要已更改为slider.value而不是1/(20-slider.value)];