介绍 这篇博客文章描述了自定义UISlider的创建,该UISlider具有默认滑块的一些附加功能。 我们将使用的类是UISlider,它是UIKit的一部分。 它是一种视觉控件,用于从连续的值范围中选择一个值。 先决条件 首先,我们需要已经对面向对象的概念有所了解,并且需要了解Objective-C语言。 硬件:我们需要有一台Mac,这是iOS开发的基本要求。 软件:要开始开发iPhone和iPad应用程序,Xcode是我们唯一需要的工具。 Xcode是Apple提供的集成开发环境(IDE),它提供了我们启动应用程序开发所需的一切。 默认UISlider的概述: UISlider由各种元素组成,例如轨道 -它为我们提供了一系列可供选择的值, 拇指 -这是一个旋钮,可帮助我们在轨道上滑动所需的值。 移动滑块的拇指时,会将其更新后的值传递给附加的任何操作。 滑块的外观是可配置的; 您可以为轨迹和拇指着色,并提供要显示在滑块末端的图像(minimumValueImage和maximumValueImage)。 您可以通过编程方式或使用Interface Builder将滑块添加到界面中。 让我们从创建演示项目开始。 1.创建一个新的Xcode 8项目 我们将为演示目的创建一个Single View应用程序 。 2.将UISlider添加到视图 在此演示中,我们将使用情节提要将UISlider添加到视图中。 将UISlider拖到Main.Storyboard文件中的视图上,并将元素附加到IBOutlets和IBActions。 从属性检查器中,我们可以根据需要提供MinimumValueImage,MaximunValueImage,MinimunTrackColor,MaximumTrackColor,Slider最小值和最大值等。 默认的UISlider几乎没有功能,例如刻度或工具提示,它们通过移动滑块来显示用户刚刚设置的滑块的值。 因此,我们将构建自定义的UISlider。 3.建立一个自定义的UISlider子类 在Main.storyboard文件中,转到UISlider,然后在身份检查器中将自定义类命名为CustomSlider。 4.添加刻度到滑块 现在,向滑块添加刻度线,我们将在滑块下方插入一个视图。 设置一个属性noofTicks,以在CustomSlider.h类的滑块中定义所需的刻度数。 在您的CustomSlider.m类中添加以下代码。 此方法将添加一个视图以显示滑块上的刻度。 现在,您只需从ViewController.m类调用此方法即可将刻度功能添加到滑块。 所以您的滑块现在看起来像这样。 现在,刻度线的目的是,每当您滑动到特定值时,旋钮都会捕捉到最近的刻度线。 为了实现相同的功能,我们重写了UISlider子类中的UIControl方法。 4.将工具提示添加到UISlider 我们可以向UISlider添加另一个有用的功能,即ToolTip。 工具提示用于向用户提供反馈,告知他或她通过移动它刚刚设置的值。 为了确定滑块值,无论何时将其更新为新值,我们都必须在UISlider子类实现中重写一些UIControl方法: 在beginTrackingWithTouch中:我们必须检查触摸是否在滑块的旋钮边界内,然后相应地显示工具提示弹出窗口。 我们在工具提示的外观/消失上添加了一些淡入/淡出效果。 这里的工具提示是一个自定义UIView,用于显示滑块值。 5.添加ToolTip UIView子类 我们必须构建一个小的视图来表示滑块值(给它一个外观一样的工具提示)。 为此,我们将使用UIBezierPath创建两个路径:一个是矩形,另一个是连接到它的箭头。 为了提供所需的外观,将两个路径合并在一起,并使用浮点值表示滑块的旋钮位置。 我们可以在子类的drawRect:方法中完成所有这些操作,通过该方法,每次值更改时都可以获取更新的视图。 […]
UISlider elementini下摆IBAction下摆IBOutlet olaraktanımlıyoruz。 Demekistediğim; 索鲁:UISlider elementini neden IBOutlet olaraktanımladık吗? 声明:UISlider elementinin“值”由IBOutlet olaraktanımladık提供。 Soru:UISlider elementini neden IBAction olaraktanımladık吗? 使用者:UISlider elementikullanıcıileetkileşimegiren biryapıyasahiptir。 KullanıcınınUISliderüzerindeyaptığıhareketleri almakiçinIBAction olaraktanımladık。 2-UISlider elementininayarlarınagözatalım。 (最小,最大ve值değerleri) UISlider elementinin“显示属性检查器” sekmesiniaçalım。 价值: UISlider ilekarşılaşıcağıilkdeğerdir。 最小值: UISlider元素最小值中的最小值。 最大值: UISlider元素的最大值为deeridir。 最大值,最小值ve值UISlider elementimizikaydırıpdeğeri标签elementindegösterelim。 😉 3-)滑块hareketlerinitanımladığımızUILabel elementindegösterelim。 “\(slider.value)” -BugösterimStringtürünecast etmektir。 String(slider.value — Bugösteriminyukarıdakigösterimilearasındahiçbirfark yoktur。 在基础上😉Anlıkolarak Sliderüzerindekiparmak hareketlerinitanımlamışolduğumuzUILabel elementineaktarıyoruz。 Soru:Sayıyıneden Stringtürünecast ettik吗? […]
我已经有一个滑块来控制文本标签的输出。 -(IBAction)mySlider:(UISlider *)sender { _myTextLabel.text = [NSString stringWithFormat:@"%i", (int) sender.value]; } 不过,我也想要一个步进器能够改变滑块的位置。 所以,如果滑块已经被设置为50,并且文本标签是50,那么我想让步进器增加到51,52,53等。有没有人知道代码要做到这一点? 谢谢!
我试图找出如何得到滑块的负值,当它回来。 当我从左向右滑动时,它返回一个正值。 当它返回时(从右到左),我需要它返回一个负值。 换句话说,我怎么能检测到滑块回来? self.borderSlider = [[UISlider alloc] initWithFrame:CGRectMake(0, 0, 200, 30)]; self.borderSlider.center = CGPointMake(self.view.centerX, SCREEN_WIDTH / 2); self.borderSlider.minimumValue = 0.0f; self.borderSlider.maximumValue = 100.0f; self.borderSlider.tintColor = [UIColor grayColor]; [self.borderSlider addTarget:self action:@selector(borderSliderValueChanged:) forControlEvents:UIControlEventValueChanged];
… ViewController.h: @property (nonatomic, strong) IBOutlet UISlider *slider; … ViewController.m: @synthesize slider; – (void)viewDidLoad { [super viewDidLoad]; … currentValue = 50; self.slider.value = currentValue; // Do any additional setup after loading the view, typically from a nib. } 的.xib: 我的界面中的UISlider连接到slider属性。 行为: 当滑块位于中间位置时,滑块一直位于值100的右侧。 我设置的动作确认currentValue的值是50.如果currentValue是50并且slider.value被设置为50,为什么这个位置不反映这个? PS我试过[slider setNeedsDisplay],并没有影响这种行为。 更新:感谢您的快速解答! 多么愚蠢的事情要做。 我打印出currentValue作为int其他地方,所以我现在设置slider.value这个代码: self.slider.value = (float) currentValue/100;
我想在UISlider上使用UIPanGestureRecognizer和UITapGestureRecognizer。 水龙头工作正常,我面临与UIPanGestureRecognizer问题。 我需要调用handleTransactionPan方法来更改UISlider的值,但不会因为它的委托方法而被调用。 我怎样才能调用select器,同时保持委托方法触发? 这是我迄今所做的代码。 – (void)viewDidLoad { [super viewDidLoad]; pr=[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleTransactionPan:)]; pr.delegate=self; [slider addGestureRecognizer:pr]; tr=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; tr.delegate=self; [slider addGestureRecognizer:tr]; } -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { return YES; } -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if(gestureRecognizer==pr) { if ([touch.view isKindOfClass:[UISlider class]]) { return NO; } } […]
我想滑块设置缓慢的价值,为此我使用这个代码 [UIView animateWithDuration:2.0 animations:^{ [self.slider setValue:(float)val]; }]; 但是这不起作用。 请帮我一下
我的应用程序使用AVAudioPlayer播放音乐文件。 它还有一个UISlider来调整正在播放的歌曲的位置。 但是,UISlider有一个奇怪的错误,那就是它正在改变audioPlayer的持续时间。 当一首歌曲开始时,作为过程的一部分,值设置如下: audioPlayer.currentTime = 0; seekingSlider.maximumValue = [audioPlayer duration]; seekingSlider.value = audioPlayer.currentTime; 这工作没有问题。 然后我有一个NSTimer更新播放时间和seekSlider。 这似乎也没有问题。 当一个用户改变了这个查找的时候,那么这个seekingChanged函数就会变成下面seekingChanged 。 – (IBAction)seekingChanged:(id)sender { audioPlayer.currentTime = seekingSlider.value; [self updatePlayedTimeLabel:audioPlayer.currentTime]; } – (void)updatePlayedTimeLabel:(NSTimeInterval)time { playedTime.text = [NSString stringWithFormat:@"%d:%02d", (int)time / 60, (int)time % 60, nil]; [playedTime sizeToFit]; } 请注意,我无法写入audioPlayer.duration。 我只是从开始和各种NSLog语句中读取它来debugging发生的事情。 令我惊讶的是,它发生了变化。 下面是一首歌曲开始处的示例输出,在设置值之后: after setting, seeking slider is at […]
我正在使用AvPlayer,并试图设置滑块以允许清理audio文件。 我有一个问题,滑块跳过所有的地方,当它被选中。 然后在返回到被拖动的位置之前,它会返回原始位置一秒钟。 你不能在Gif上看到我的光标,但光滑的细长拖动是我移动旋钮,然后快速鞭子是滑块行为不端。 我花了数小时search,并通过堆栈溢出梳理,不能找出我在这里做错了什么,很多类似的问题是相当老,在ObjC。 这是代码段,我认为是负责的问题,它处理的滑块被移动事件:我试过了,没有if语句也没有看到不同的结果。 @IBAction func horizontalSliderActioned(_ sender: Any) { horizontalSlider.isContinuous = true if self.horizontalSlider.isTouchInside { audioPlayer?.pause() let seconds : Int64 = Int64(horizontalSlider.value) let preferredTimeScale : Int32 = 1 let seekTime : CMTime = CMTimeMake(seconds, preferredTimeScale) audioPlayerItem?.seek(to: seekTime) audioPlayer?.play() } else { let duration : CMTime = (self.audioPlayer?.currentItem!.asset.duration)! let seconds : Float64 = […]
我在其他方面看过这个问题,但没有一个答案适用于我的情况。 我有一个UIPageViewController有一个包含UISlider的子视图控制器。 当您尝试移动滑块时,它会激活页面视图控制器的滚动。 您必须点击,在滑块圆上暂停,然后移动。 UIPageViewController设置为滚动types,因此未设置gestureRecognizers。 (标头状态“只有过渡样式是'UIPageViewControllerTransitionStylePageCurl')填充。 因此,我甚至无法正确访问手势。 我已经尝试了几件事情,以防止UIPageViewController影响滑块,但无济于事。 我试过了:1)走子子树,并设置UIScrollView的平移手势委托给自己(这会导致崩溃)2)在顶部添加我自己的手势,并检查y值。 这将防止滑动,但它也吃龙头和移动,所以滑块实际上并没有如预期的那样改变3)实现了自定义滑块的自定义手势。 问题是我无法匹配的平移手势改变滑块在相同的默认值。 既然你必须实现平移,并自己调整位置,那么很难匹配真实的行为。 这些方法都不适用于我。 有没有人能够解决这个问题? 我能想到的唯一解决scheme是防止一起滚动,添加左/右button,并相应地编程转换页面。