iOS UISlider 值不匹配

Posted

技术标签:

【中文标题】iOS UISlider 值不匹配【英文标题】:iOS UISlider values mismatched 【发布时间】:2017-03-24 18:07:17 【问题描述】:

我在我的一个应用程序中实现了垂直滑块,它扩展了UISlider。当滚动结束/完成时,我将使用 Slider 值向服务器发送命令。有时当我快速向上/向下滚动并释放时,滑块值在发送命令之前和发送命令之后会变得不匹配。

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
   NSLog(@"Value of Slider before sending command=%f",self.value);
   [self sendCommand]; // Here value is something else  
   [super touchesEnded:touches withEvent:event];
   NSLog(@"Slider value after sending command=%f",self.value); // Here value changed

但是,如果我在发送命令之前发出超级呼叫,那么一切正常。如果有人知道为什么会这样,请解释一下。

[super touchesEnded:touches withEvent:event];

更有趣的事实是,如果我不调用 super,那么一切正常。

【问题讨论】:

以下链接可能对您有用***.com/a/4742966/5184217 @RajeshDharani 我检查了链接,但这似乎与我正在寻找的内容无关。无论如何谢谢你。 我在下面解释了它。请检查一下。 @handiansom 请查看我的回复,感谢您的回答,但不幸的是,情况并非如此。 【参考方案1】:

这是因为 [super touchesEnded:touches withEvent:event]; 方法是滑块根据交互更新其值的地方。所以在调用 super 之前这个值已经过期了。

对 super 的调用通常应该是被覆盖方法的第一行。

【讨论】:

感谢您的回复,我只是想确认为什么这些价值观每次都不会过时。即使我尝试同步块以确保另一个下一个事件不更新值,但这也没有奏效。所以我放置计时器,然后在延迟一段时间后调用 super ,这些值每次都会过时吗?【参考方案2】:

尽管名称 touchesEnded: 暗示滑块已完成更新,但它仍可能根据用户抬起手指的方式更新值。如果您考虑用户快速滑动然后抬起手指,这是有道理的——他们可能希望手指在该方向上移动的距离比他们的手指实际移动的稍远。

【讨论】:

感谢您的解释,从日志中它看起来与您正在解释的相同。因为价值观正在更新。我正在寻找一些文档。链接或更多解释,我可以每次都复制它。【参考方案3】:

当手指或 Apple Pencil 不再可用时,UIKit 会调用此方法 触摸屏幕。许多 UIKit 类重写了这个方法并使用 它要清理相应的处理所涉及的状态 触摸事件。此方法的默认实现转发 向响应者链发送消息。创建自己的子类时, 调用 super 转发任何您自己不处理的事件。为了 例如,[super touchesEnded:touches withEvent:event];

如果你在不调用 super 的情况下重写了这个方法(一个常见的用法 模式),您还必须覆盖其他处理触摸的方法 事件,即使你的实现什么都不做。

【讨论】:

谢谢你的回复,是的,我在苹果网站上读到了这个。如果您根据它检查我的问题,如果我删除超级呼叫,一切正常。所以这一定不是原因。

以上是关于iOS UISlider 值不匹配的主要内容,如果未能解决你的问题,请参考以下文章

匹配 UIToolBar 中的 MPVolumeView 和 UISlider 垂直位置

UISlider 调整以匹配 UITextField 值

iOS - 折叠动画 UISlider

在ios中设置uislider的值

iOS 7 - 自定义 UISlider 设计不起作用

如何使用 UISlider 控制 iOS 系统音量