Xcode / Xamarin OSX应用程序:具有自定义步骤的UISlider

时间:2017-09-26 11:43:29

标签: xcode macos xamarin xamarin.mac

我正在构建一个Xamrain原生OSX应用程序。我需要构建一个UI滑块,文本输入和数字步进器来表示快门速度。但由于快门​​速度不是均匀顺序,我无法看到一种方法。

我已经有了这个用于分贝和百分比的ui元素,其中三个组件都绑定到一个模型的值,这很有效......

enter image description here

例如,这基本上具有0-800的数值范围,以及用于文本输入的数字格式化器。

但快门速度为1 / 25,1 / 30,1 / 60,1 / 90,1 / 100等等。

不是均匀分布,而不是数值范围。我可以将它们转换为毫秒(因此1/25将是40),但步骤仍然不均匀。

关于如何在原生OSX Xamarin应用程序中实现这一点的任何想法?

你能用不均匀的步骤制作步进器吗? 或者是否可以将它映射到索引数组,并且在更改时通过索引从数组中获取对象以获取实际值?

我担心随着数字格式和数据绑定,它将变得复杂..

1 个答案:

答案 0 :(得分:0)

以下是我在使用get_stylesheet_directory_uri的原型中所做的(我转换它后来做了自定义控件):

假设您有这两个数组:

UISlider

float[] shutterSpeeds = new float[] { 1 / 1000f, 1 / 500f, 1 / 250f, 1 / 60f, 1 / 30f, 1 / 15f, 1 / 8f, 1 / 4f, 1 / 2f, 1f }; string[] shutterSpeedsLabel = new string[] { "1/1000", "1/500", "1/250", "1/60", "1/30", "1/15", "1/8", "1/4", "1/2", "1" }; 设置:

UISlider

uiSlider.Value = shutterSpeeds[0]; uiSlider.MinValue = shutterSpeeds[0]; uiSlider.MaxValue = shutterSpeeds[shutterSpeeds.Length - 1]; uiSlider.Continuous = true; uiSlider.ValueChanged += (sender, e) => { uiLabel.Text = shutterSpeedsLabel[SnapTofStop(sender as UISlider).Index]; }; uiSlider.TouchUpInside += (sender, e) => { var slider = sender as UISlider; slider.Value = SnapTofStop(sender as UISlider).fStop; }; 方法:

SnapTofStop

注意:由于快门速度接近对数刻度,因此会对UISlider产生非线性效果。您可以将数组中fStop条目的数量除以提供"对齐"通过对UISlider值应用对数曲线拟合例程来确定最接近的fStop,从而UISlider将提供线性"步骤"到下一个fStop。

您可以使用(float fStop, int Index) SnapTofStop(UISlider slider) { var snapToValue = shutterSpeeds.Reverse().TakeWhile(_ => _.CompareTo(slider.Value) >= 0).Last(); var snapToIndex = Array.FindIndex(shutterSpeeds, _ => _.CompareTo(snapToValue) == 0); return (snapToValue, snapToIndex); } 执行相同的操作,并在正/负步骤上捕捉到fStop值。