Ios 添加UIImage';s称为;勾号“;滑翔机

Ios 添加UIImage';s称为;勾号“;滑翔机,ios,objective-c,uiimage,uislider,Ios,Objective C,Uiimage,Uislider,先总结一下我的问题:我试图根据只知道UISlider的持续时间,并有一系列循环时间来确定可以在滑块上放置图像的位置,并相应地放置图像 我一直在阅读UISlider上的苹果文档,似乎没有基于浮动数组在UISlider上添加“记号”的原生方法。“记号”表示滑块上的线条,例如用于在洗涤器上放置广告的线条。以下是一个可视化: 现在,我有一个充满浮动的数组;浮动,我将使用它根据UISlider的值删除刻度线。数组中的浮点值每次都不同。我想循环使用我的UISlider的.value属性,相应地删除UIIm

先总结一下我的问题:我试图根据只知道UISlider的持续时间,并有一系列循环时间来确定可以在滑块上放置图像的位置,并相应地放置图像

我一直在阅读UISlider上的苹果文档,似乎没有基于浮动数组在UISlider上添加“记号”的原生方法。“记号”表示滑块上的线条,例如用于在洗涤器上放置广告的线条。以下是一个可视化:

现在,我有一个充满浮动的数组;浮动,我将使用它根据UISlider的值删除刻度线。数组中的浮点值每次都不同。我想循环使用我的UISlider的.value属性,相应地删除UIImages。UIImage是我创建的小png资产的记号。我搞不清楚的是,在UISlider的.value属性中循环并根据UISlider的未来位置放置UIImage背后的逻辑。数组中的浮点值每次都会不同,因此我无法静态放置它们。有人知道从哪里开始吗?我对Objective-C编程还是有点陌生

我知道可以在屏幕上检索滑块的起始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.minimumValu‌​e)) * sliderRange) + sliderOrigin);

    return sliderValueToPixels;
}

也许我可以在for循环中添加一个计算,以根据该计算来放置图像。我只是不太确定从哪里开始

我想你将很难定位记号。但是,如果UISlider的父视图为“视图”,则可以添加如下子视图:

[view addSubView:myTickView];
添加的子视图的位置由其父视图坐标空间中的框架特性确定。 要删除视图,请执行以下操作:

[myTickView removeFromSuperView];

您也可以循环查看勾号视图并更改这些帧,但这些更改将设置动画,因此如果您这样做,勾号将显示为滑动,除非您关闭动画。

提供了trackRectForBounds和thumbRectForBounds方法用于对UISlider进行子类化,但您可以直接调用它们,他们会把你的蜱虫中心放在前面

- (float)sliderThumbCenter:(UISlider *)slider forValue:(float)value{
    CGRect trackRect = [slider trackRectForBounds:slider.bounds];
    CGRect thumbRect = [slider thumbRectForBounds:slider.bounds trackRect:trackRect value:value];
    CGFloat centerThumb = CGRectGetMidX(thumbRect);
    return centerThumb;
}
使用自定义视图绘制轨迹可能比使用图像视图更容易,然后只需将滑块放在其顶部并隐藏轨迹即可。只需使滑块帧等于TickView的边界即可。我真的认为UISlider子类会更好,但这是可行的

@interface TickView : UIView
@property UIColor *tickColor;
@property int tickCount;
@property CGFloat tickHeight;
@property (weak) UISlider *slider;
@property float *ticks;
-(void)setTicks:(float *)ticks count:(int)tickCount;
@end


@implementation TickView{
    __weak UISlider *_slider;
}

-(instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.tickColor = [UIColor grayColor];
        self.backgroundColor = [UIColor clearColor];
        self.tickCount = 7;
        self.ticks = malloc(sizeof(float) * self.tickCount);
        self.tickHeight = 10;
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, self.tickColor.CGColor);

    CGContextBeginPath(context);
    CGFloat centerY = rect.size.height / 2;
    CGContextMoveToPoint(context, 0, centerY);
    CGContextAddLineToPoint(context, rect.size.width, centerY);
    CGFloat tickTop = centerY - self.tickHeight / 2;
    CGFloat tickBottom = centerY + self.tickHeight / 2;
    CGFloat tickX = 0;

    if (self.slider) {
        for (int i = 0; i < self.tickCount; i++) {
            tickX = [self sliderThumbCenter:self.slider forValue:self.ticks[i]];
            CGContextMoveToPoint(context, tickX, tickTop);
            CGContextAddLineToPoint(context, tickX, tickBottom);
        }
    }
    else{
        CGFloat tickSpacing = rect.size.width / (self.tickCount - 1);
        for (int i = 0; i < self.tickCount; i++) {
            CGContextMoveToPoint(context, tickX, tickTop);
            CGContextAddLineToPoint(context, tickX, tickBottom);
            tickX += tickSpacing;
        }
    }
    CGContextStrokePath(context);
}

-(void)setTicks:(float *)ticks count:(int)tickCount{
    free(_ticks);
    _ticks = malloc(sizeof(float) * tickCount);
    memcpy(_ticks, ticks, sizeof(float) * tickCount);
    _tickCount = tickCount;
    [self setNeedsDisplay];
}
- (float)sliderThumbCenter:(UISlider *)slider forValue:(float)value{
    CGRect trackRect = [slider trackRectForBounds:slider.bounds];
    CGRect thumbRect = [slider thumbRectForBounds:slider.bounds trackRect:trackRect value:value];
    CGFloat centerThumb = CGRectGetMidX(thumbRect);
    return centerThumb;
}
-(void)setSlider:(UISlider *)slider{
    _slider = slider;
}
-(UISlider *)slider{
    return _slider;
}
-(void)dealloc{
    free(_ticks);
}
@end
@界面TickView:UIView
@属性UIColor*tickColor;
@财产计数;
@属性属性和高度;
@属性(弱)UISlider*滑块;
@属性浮动*刻度;
-(void)setTicks:(float*)ticks count:(int)tickCount;
@结束
@实现视图{
__弱UISlider*_滑块;
}
-(instancetype)initWithFrame:(CGRect)frame{
self=[super initWithFrame:frame];
如果(自我){
self.tickColor=[UIColor grayColor];
self.backgroundColor=[UIColor clearColor];
self.tickCount=7;
self.ticks=malloc(sizeof(float)*self.tickCount);
自身高度=10;
}
回归自我;
}
-(void)drawRect:(CGRect)rect{
CGContextRef context=UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(上下文,self.tickColor.CGColor);
CGContextBeginPath(上下文);
CGFloat centerY=rect.size.height/2;
CGContextMoveToPoint(上下文,0,centerY);
CGContextAddLineToPoint(上下文,rect.size.width,centerY);
CGFloat tickTop=centerY-self.tickHeight/2;
CGFloat tickBottom=centerY+self.tickHeight/2;
cGx=0;
if(自滑动条){
for(int i=0;i
UISliders没有duration属性。你是说有价值的财产吗?如果是,请编辑您的问题。是的,我的意思是持续时间,我的变量名是持续时间。OP编辑。此外,滑块的宽度与其最小值或最大值无关。它由滑块的“帧”属性确定。但是,他们无法获得滑块起点和终点的准确位置。@MichaelL True,我用潜在代码更新了OP,可以用来代替它。谢谢您的输入!在您发布的第一个方法中,似乎调用会移动洗涤器,不是吗?我试图实现的主要目标是,根据只知道UISlider的持续时间,并有一系列时间循环放置图像,确定可以在滑块上放置图像的位置。不,它不会移动拇指。它的目的是获得拇指中心在某个值处的x偏移。所以如果你的滑块从0->10,你想知道拇指在哪里