UISlider setMaximumTrackTintColor in iOS 7.1

时光毁灭记忆、已成空白 提交于 2019-12-17 18:28:54

问题


[slider setMaximumTrackTintColor: color]

has unexpected results in iOS 7.1 (the slider bar changes its position appearing at top instead of vertical center or disappears completely), while working fine with prior versions.

[slider setMinimumTrackTintColor: color]

does render the expected result.

This question might be related: UISlider setMaximumTrackTintColor, but no answer so far.

Update:

I get this:

instead of:

Update #2:

Using setMaximumTrackImage might work, but the solution I'm looking for is a way to set any random color and not a preexisting image.

Update #3:

This issue is still present in iOS 7.1.1.


回答1:


Found this workaroud:

Create a 1x1px UIImage from a UIColor on the fly:

CGRect rect = CGRectMake(0, 0, 1, 1);
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
[color setFill];
UIRectFill(rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

and then

[slider setMaximumTrackImage:image forState:UIControlStateNormal];

Looks like an expensive solution but it gets the job done.




回答2:


Try this out:

UIImage *sliderLeftTrackImage = [[UIImage imageNamed:@"LeftImage.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
UIImage *sliderRightTrackImage = [[UIImage imageNamed:@"RightImage.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];

[sliderName setMinimumTrackImage: sliderLeftTrackImage forState: UIControlStateNormal];
[sliderName setMaximumTrackImage: sliderRightTrackImage forState: UIControlStateNormal];

If you want to change thumb image the following code will work:

[sliderName setThumbImage:[UIImage imageNamed:@"ThumbImgName.png"] forState:UIControlStateNormal];
[sliderName setThumbImage:[UIImage imageNamed:@"ThumbImgName.png"] forState:UIControlStateHighlighted];

In same way, you can also use color instead of images.




回答3:


I've created 2px images with the colour of slider track.

And then I set they as tracking images (here's with thumb image for iPad and iPhone)

UIImage *thumbImage = [UIImage imageNamed:@"slider"];
UIImage *trackImage;

if (isiPad) {
    [[UISlider appearance] setThumbImage:thumbImage forState:UIControlStateNormal];
    [[UISlider appearance] setThumbImage:thumbImage forState:UIControlStateHighlighted];
    trackImage = [UIImage imageNamed:@"menu-bar-ipad"];
}
else {
    [[UISlider appearance] setThumbImage:[self imageWithImage:thumbImage scaledToSize:CGSizeMake(27, 27)] forState:UIControlStateNormal];
    [[UISlider appearance] setThumbImage:[self imageWithImage:thumbImage scaledToSize:CGSizeMake(27, 27)] forState:UIControlStateHighlighted];
    trackImage = [UIImage imageNamed:@"menu-bar"];
}

[[UISlider appearance]  setMinimumTrackImage:trackImage forState:UIControlStateNormal];
[[UISlider appearance]  setMaximumTrackImage:trackImage forState:UIControlStateNormal];

And that's all. Same solution as msmq I guess. And you can see both ways how to make a large image - two images way and scaling way.




回答4:


Update

Reported this bug and it's already well known. Hopefully they will fix it soon...




回答5:


Maybe a little bit late, but - here is the answer

You should read description of setter:

The color used to tint the standard maximum track images. Setting this property removes any custom maximum track images associated with the slider.

Also this applicable only for maximum color, because minimum setter just change titntColor:

The color used to tint the standard minimum track images.

This mean that slider use some image for maximum track and if u just set tint color nothing will be changes (nothing can't be tinted).

Solution (thanks to @user623396):

UIImage *currentSliderMaximumImage = self.slider.currentMaximumTrackImage;

CGRect rect = CGRectMake(0, 0, currentSliderMaximumImage.size.width, currentSliderMaximumImage.size.height);
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
[[[DynamicUIService service] currentApplicationColor] setFill];
UIRectFill(rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self.slider setMaximumTrackImage:image forState:UIControlStateNormal];

As result u will get



来源:https://stackoverflow.com/questions/22345668/uislider-setmaximumtracktintcolor-in-ios-7-1

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!