我正在构建一个Xamrain原生OSX应用程序。我需要构建一个UI滑块,文本输入和数字步进器来表示快门速度。但由于快门速度不是均匀顺序,我无法看到一种方法。
我已经有了这个用于分贝和百分比的ui元素,其中三个组件都绑定到一个模型的值,这很有效......
例如,这基本上具有0-800的数值范围,以及用于文本输入的数字格式化器。
但快门速度为1 / 25,1 / 30,1 / 60,1 / 90,1 / 100等等。
不是均匀分布,而不是数值范围。我可以将它们转换为毫秒(因此1/25将是40),但步骤仍然不均匀。
关于如何在原生OSX Xamarin应用程序中实现这一点的任何想法?
你能用不均匀的步骤制作步进器吗? 或者是否可以将它映射到索引数组,并且在更改时通过索引从数组中获取对象以获取实际值?
我担心随着数字格式和数据绑定,它将变得复杂..
答案 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值。