有没有办法通过移动滑块拇指来移动我的imageview?

时间:2011-04-11 18:55:49

标签: iphone uislider

我想在用户滑动UISlider的拇指时移动我的imageview,图像视图也应该具有滑块的值。有没有人对此有任何想法?这是代码片段:

   -(void)addSliderX:frame andminimumValue:(int)min andmaximumValue:(int)max andSliderValue:(int)value{
    CGRect frame1 = CGRectFromString(frame);
    statSlider = [[UISlider alloc]initWithFrame:frame1];
    [statSlider setMinimumTrackImage:[[UIImage imageNamed:@"greenSlider.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:10.0] forState:UIControlStateNormal]; 
    [statSlider setThumbImage:[UIImage imageNamed:@"sliderBar_greenThumb.png"] forState:UIControlStateNormal];
    [statSlider setMinimumValue:min];
    [statSlider setMaximumValue:max];
    statSlider.continuous = YES;
    [statSlider addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged];
    [statSlider addTarget:self action:@selector(sliderChanged:) forControlEvents:UIControlEventTouchUpInside];
    //bubbleViewController = [[SFNDoorBubbleViewController alloc]initWithNibName:@"SFNDoorBubbleViewController"bundle:[NSBundle mainBundle]];

    //popoverController = [[UIPopoverController alloc] initWithContentViewController:bubbleViewController];
    //[popoverController setPopoverContentSize:bubbleViewController.view.frame.size];
    [self.view addSubview:statSlider]; 
}
-(void)valueChanged:(id)sender{


    UISlider *localSlider = (UISlider *)sender;
    bubble = [[UIView alloc]init];
    back = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"sliderBar_handle_number.png"]];
    greenSliderValue = [[NSString alloc] initWithString:[NSString stringWithFormat:@"%3.0f", [localSlider value]]];
    UILabel * val = [[UILabel alloc]init];

    dsp =[greenSliderValue floatValue];
    val.text = greenSliderValue;
    [bubbleViewController updateSliderValueTo:dsp];
    CGFloat sliderMax = localSlider.maximumValue;
    CGFloat sliderMin = localSlider.minimumValue;

    CGFloat sliderMaxMinDiff = sliderMax - sliderMin;
    CGFloat sliderValue = dsp;

    if(sliderMin < 0.0) {

        sliderValue = dsp-sliderMin;
        sliderMax = sliderMax - sliderMin;
        sliderMin = 0.0;
        sliderMaxMinDiff = sliderMax - sliderMin;
    }

    CGFloat xCoord = ((sliderValue-sliderMin)/sliderMaxMinDiff)*[localSlider frame].size.width-bubbleViewController.view.frame.size.width/2.0;

    CGFloat halfMax = (sliderMax+sliderMin)/2.0;

    if(sliderValue > halfMax) {

        sliderValue = (sliderValue - halfMax)+(sliderMin*1.0);
        sliderValue = sliderValue/halfMax;
        sliderValue = sliderValue*11.0;

        xCoord = xCoord - sliderValue;
    }

    else if(sliderValue <  halfMax) {

        sliderValue = (halfMax - sliderValue)+(sliderMin*1.0);
        sliderValue = sliderValue/halfMax;
        sliderValue = sliderValue*11.0;

        xCoord = xCoord + sliderValue;
    }
    [self.view addSubview:bubble];
    [bubble addSubview:back];
    [bubble addSubview:val];
    bubble.frame = CGRectMake(xCoord, 500, bubbleViewController.view.frame.size.width, bubbleViewController.view.frame.size.height);

}

1 个答案:

答案 0 :(得分:0)

每次调用changedValue:时,您都会创建一个新的UIView,UIImageView和UILabel。
而不是编辑旧实例。这导致所有旧的UIViews构建了一条“路径”。

在viewDidLoad中,您可以创建这三个视图,并在每个.tag property上设置 viewDidLoad

UIView* bubble = [[UIView alloc]init];
UIImageView* back = [[UIImageView alloc]initWithImage:[UIImageimageNamed:@"sliderBar_handle_number.png"]];
UILabel * val = [[UILabel alloc]init]
//other configurations ...
bubble.tag = 1;
back.tag = 2;
val.tag = 3; 
[self.view addSubview:bubble];
[bubble addSubview:back];
[bubble addSubview:val];

现在删除所有分配,因为我们想重用现有的视图。我们知道他们的标签 的(无效)的valueChanged:(ID)发送

UISlider *localSlider = (UISlider *)sender;
NSString* greenSliderValue = [[NSString alloc] initWithString:[NSString stringWithFormat:@"%3.0f", [localSlider value]]];
UIView *bubble = (UIView*)[self.view.subviews viewWithTag:1];
UIImageView *back = (UIImageView*)[bubble.subviews viewWithTag:2];
UILabel *val = (UILabelw*)[bubble.subviews viewWithTag:3];
dsp =[greenSliderValue floatValue];
val.text = greenSliderValue;
[bubbleViewController updateSliderValueTo:dsp];
CGFloat sliderMax = localSlider.maximumValue;
CGFloat sliderMin = localSlider.minimumValue;

CGFloat sliderMaxMinDiff = sliderMax - sliderMin;
CGFloat sliderValue = dsp;

if(sliderMin < 0.0) {

sliderValue = dsp-sliderMin;
sliderMax = sliderMax - sliderMin;
sliderMin = 0.0;
sliderMaxMinDiff = sliderMax - sliderMin;
}

CGFloat xCoord = ((sliderValue-sliderMin)/sliderMaxMinDiff)*[localSlider frame].size.width-bubbleViewController.view.frame.size.width/2.0;

CGFloat halfMax = (sliderMax+sliderMin)/2.0;

if(sliderValue > halfMax) {

sliderValue = (sliderValue - halfMax)+(sliderMin*1.0);
sliderValue = sliderValue/halfMax;
sliderValue = sliderValue*11.0;

xCoord = xCoord - sliderValue;
}

else if(sliderValue <  halfMax) {

sliderValue = (halfMax - sliderValue)+(sliderMin*1.0);
sliderValue = sliderValue/halfMax;
sliderValue = sliderValue*11.0;

xCoord = xCoord + sliderValue;
}
bubble.frame = CGRectMake(xCoord, 500, bubbleViewController.view.frame.size.width, bubbleViewController.view.frame.size.height);

现在您可以使用现有实例