wil*_*lc2 30 iphone user-interface cocoa-touch uislider
我正在创建一个自定义UISlider来测试一些界面的想法.主要是基于使拇指图像更大.
我发现了如何做到这一点,如下:
UIImage *thumb = [UIImage imageNamed:@"newThumbImage_64px.png"];
[self.slider setThumbImage:thumb forState:UIControlStateNormal];
[self.slider setThumbImage:thumb forState:UIControlStateHighlighted];
[thumb release];
Run Code Online (Sandbox Code Playgroud)
为了计算相关值,我需要知道拇指图像的中心点在被操纵时的位置.这一点应该是它的超视图的坐标.
看看UISlider文档,我没有看到跟踪这个的任何属性.
是否有一些简单的方法来计算这个或者它是否可以从一些现有的价值中得出?
wil*_*lc2 57
这将在视图坐标中返回UISlider的拇指中心图像的正确X位置:
- (float)xPositionFromSliderValue:(UISlider *)aSlider {
float sliderRange = aSlider.frame.size.width - aSlider.currentThumbImage.size.width;
float sliderOrigin = aSlider.frame.origin.x + (aSlider.currentThumbImage.size.width / 2.0);
float sliderValueToPixels = (((aSlider.value - aSlider.minimumValue)/(aSlider.maximumValue - aSlider.minimumValue)) * sliderRange) + sliderOrigin;
return sliderValueToPixels;
}
Run Code Online (Sandbox Code Playgroud)
将它放在视图控制器中并像这样使用它:(假设属性名为slider)
float x = [self xPositionFromSliderValue:self.slider];
Run Code Online (Sandbox Code Playgroud)
gir*_*_vr 22
我在阅读了上述建议后试过这个 -
yourLabel = [[UILabel alloc]initWithFrame:....];
//Call this method on Slider value change event
-(void)sliderValueChanged{
CGRect trackRect = [self.slider trackRectForBounds:self.slider.bounds];
CGRect thumbRect = [self.slider thumbRectForBounds:self.slider.bounds
trackRect:trackRect
value:self.slider.value];
yourLabel.center = CGPointMake(thumbRect.origin.x + self.slider.frame.origin.x, self.slider.frame.origin.y - 20);
}
Run Code Online (Sandbox Code Playgroud)
对于Swift版本
func sliderValueChanged() -> Void {
let trackRect = self.slider.trackRect(forBounds: self.slider.bounds)
let thumbRect = self.slider.thumbRect(forBounds: self.slider.bounds, trackRect: trackRect, value: self.slider.value)
yourLabel.center = CGPoint(x: thumbRect.origin.x + self.slider.frame.origin.x + 30, y: self.slider.frame.origin.y - 60)
}
Run Code Online (Sandbox Code Playgroud)
通过使用此代码段,我可以获得最准确的价值.
Med*_*ida 19
斯威夫特3
extension UISlider {
var thumbCenterX: CGFloat {
let trackRect = self.trackRect(forBounds: frame)
let thumbRect = self.thumbRect(forBounds: bounds, trackRect: trackRect, value: value)
return thumbRect.midX
}
}
Run Code Online (Sandbox Code Playgroud)
Psy*_*cho 11
我想知道为什么没有人提供阅读手册中最简单的答案.您可以通过简单地使用以下方法准确地计算所有这些值并确保它们保持原样:
- (CGRect)trackRectForBounds:(CGRect)bounds
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value
Run Code Online (Sandbox Code Playgroud)
您可以在开发人员文档中轻松找到它.
如果拇指图像发生更改并且您想要更改其定位方式,则可以继承并覆盖这些方法.第一个给你一个矩形,拇指可以在第二个移动拇指本身的位置.
Yar*_*sim 10
最好使用-[UIView convertRect:fromView:]
方法代替.没有任何复杂的计算,它更清洁,更容易:
- (IBAction)scrub:(UISlider *)sender
{
CGRect _thumbRect = [sender thumbRectForBounds:sender.bounds
trackRect:[sender trackRectForBounds:sender.bounds]
value:sender.value];
CGRect thumbRect = [self.view convertRect:_thumbRect fromView:sender];
// Use the rect to display a popover (pre iOS 8 code)
[self.popover dismissPopoverAnimated:NO];
self.popover = [[UIPopoverController alloc] initWithContentViewController:[UIViewController new]];
[self.popover presentPopoverFromRect:thumbRect inView:self.view
permittedArrowDirections:UIPopoverArrowDirectionDown|UIPopoverArrowDirectionUp animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
我通过首先将UISlider的值间隔以百分比映射,然后取滑块大小的相同百分比减去拇指大小的百分比来接近它,这是我添加拇指大小的一半以获得其中心的值.
- (float)mapValueInIntervalInPercents: (float)value min: (float)minimum max: (float)maximum
{
return (100 / (maximum - minimum)) * value -
(100 * minimum)/(maximum - minimum);
}
- (float)xPositionFromSliderValue:(UISlider *)aSlider
{
float percent = [self mapValueInIntervalInPercents: aSlider.value
min: aSlider.minimumValue
max: aSlider.maximumValue] / 100.0;
return percent * aSlider.frame.size.width -
percent * aSlider.currentThumbImage.size.width +
aSlider.currentThumbImage.size.width / 2;
}
Run Code Online (Sandbox Code Playgroud)
稍微玩了一下 IB 和 1px 宽的拇指图像后,拇指的位置正是您所期望的位置:
UIImage *thumb = [UIImage imageNamed:@"newThumbImage_64px.png"];
CGRect sliderFrame = self.slider.frame;
CGFloat x = sliderFrame.origin.x + slideFrame.size.width * slider.value + thumb.size.width / 2;
CGFloat y = sliderFrame.origin.y + sliderFrame.size.height / 2;
return CGPointMake(x, y);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
24991 次 |
最近记录: |