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

Xcode / Xamarin OSX App : UISlider with custom steps

我正在开发 uiXamrain 本机 OSX 应用程序。我需要构建一个 uild 一个 UI 滑块、文本输入和数字步进器来表示快门速度。但是由于快门速度不是均匀连续的,我看不出有什么办法可以做到这一点。

我已经有了这个 ui 分贝和百分比元素,其中三个分量都绑定到一个模型以获得它们的值,效果很好...

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

但是快门速度是1/25、1/30、1/60、1/90、1/100等等

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

关于如何在本机 OSX Xamarin 应用程序中实现这一点有什么想法吗?

你能做一个台阶不均匀的步进器吗?
或者有没有办法将它映射到索引数组,并在更改时通过索引从数组中获取对象以获取实际值?

我担心数字格式和数据绑定会变得很复杂..

这是我在使用 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方法:

(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);
}

注意:这会对 UISlider 产生非线性影响,因为快门速度接近对数刻度。您可以通过将对数曲线拟合例程应用于 UISlider 值来划分数组中的 fStop 条目数以提供 "snap to" 范围以确定最接近的 fStop,因此 UISlider 将为下一个提供线性 "steps" fStop.

您可以对 UIStepper 执行相同的操作,并捕捉到 positive/negitive 步长的 fStop 值。