我正在构建一个Xamrain本地OSX应用程序。我需要建立一个UI滑翔机,文字输入和数字步进来表示快门速度。但由于快门的速度不是均匀的顺序,我看不出有什么方法可以做到。
我已经有了这个用于分贝和百分比的ui元素,其中这三个组件都绑定到一个模型中作为它们的值,这很好.

例如,这基本上有一个数值范围0-800,以及文本输入的数字格式化程序。
但是快门的速度是1/25,1/30,1/60,1/90,1/100等等。
不是均匀分布,也不是数值范围。我可以将它们转换为毫秒(这样1/25将是40),但是步骤仍然不均匀。
对于在本地OSX Xamarin应用程序中如何实现这一点,有什么想法吗?
你能用参差不齐的步伐做一个步进吗?
或者是否有方法将其映射到索引数组,并在更改时按索引从数组中获取对象以获得实际值?
我担心,随着数字的格式化和数据绑定,它将变得更加复杂。
发布于 2017-09-27 02:42:13
下面是我在一个使用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产生非线性影响,因为快门速度接近对数标度。可以将数组中的fStop条目数除以“向”范围,方法是对UISlider值应用对数曲线拟合例程来确定最接近的fStop,这样UISlider将向下一个fStop提供线性的“步骤”。
您可以对UIStepper执行同样的操作,并在一个正/negitive步骤上切换到一个fStop值。
https://stackoverflow.com/questions/46425613
复制相似问题