iPhone 垂直拨动开关
Posted
技术标签:
【中文标题】iPhone 垂直拨动开关【英文标题】:iPhone vertical toggle switch 【发布时间】:2010-05-14 18:03:58 【问题描述】:我正在尝试为 iPhone 创建一个垂直切换开关控件(沿着 UISwitch 的线条,但垂直滑动)。
我想知道现有控件是否已经存在,或者是否有任何好的教程可以解释为 iPhone 创建自定义控件的基础知识。
目前我已经尝试使用仿射变换从基本的 UIswitch 创建垂直开关,它的工作原理是滑块与滑块轨道相比太小,因此我正在寻找有关编写自定义控件的信息。
非常感谢任何方向。
【问题讨论】:
【参考方案1】:您可以使用一个 UIButton 和两个图像使其看起来像一个垂直切换开关,并根据开关状态交换图像。
子类UIButton,添加开关状态,图片交换等,按需使用。
EDIT -- 另一种方法是完全自定义控件。您将UIControl 子类化并添加类似于UISwitch 的函数(即:initWithFrame、on、setOn:animated:)。
您还需要发送状态更改的事件,类似于 UISwitch 所做的:
[self sendActionsForControlEvents: UIControlEventValueChanged];
您实现 beginTrackingWithTouch、continueTrackingWithTouch 和 endTrackingWithTouch 以在触摸在开关上移动时滑动开关图像。我这样做是为了创建一个 2D 滑块。 UISwitch 也做了自己的本地化,例如 ON/OFF 变为 0/1。
【讨论】:
我也考虑过这个,但是开关必须是完全可滑动的,这就排除了这个选项。 啊,是的,那么滑动图像的自定义控件是最简单的方法。 是的,这几乎就是我最终所做的。 :)【参考方案2】:在 UISlider 的特定情况下,您可以从中派生并覆盖一些选择方法:
// lets a subclass lay out the track and thumb as needed
- (CGRect)minimumValueImageRectForBounds:(CGRect)bounds;
- (CGRect)maximumValueImageRectForBounds:(CGRect)bounds;
- (CGRect)trackRectForBounds:(CGRect)bounds;
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value;
默认实现基本上是根据最后一次调用中的值水平滑动拇指。如果你垂直滑动它,你有一个垂直滑块。只需将所有图像设置为您自己的自定义图稿并实施这些方法以根据需要定位事物。您的 thumbRect 方法最终会得到如下所示的一行:
result.origin.y = trackFrame.origin.y + ( trackFrame.size.height - thumbFrame.size.height ) * value;
【讨论】:
我实际上是在谈论像这样的拨动开关theapplevine.com/wp-content/uploads/2009/11/…【参考方案3】:我使用了自定义滑块并设置了变换。然后,在选择器中,我有一个简单的 if 语句,如果大于 50,则将其捕捉到 100,如果小于,则将其捕捉到 0。我在网上找到了自定义幻灯片代码:http://www.iphonedevsdk.com/forum/iphone-sdk-development/11470-there-way-i-can-use-slide-unlock-slider.html
- (void)create_Custom_UISlider
CGRect frame = CGRectMake(100.0, 110.0, 180, 1.0 );
CGRect thumb = CGRectMake(100.0, 110.0, 1.0, 1.0);
customSlider = [[UISlider alloc] initWithFrame:frame];
[customSlider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
// in case the parent view draws with a custom color or gradient, use a transparent color
customSlider.backgroundColor = [UIColor clearColor];
customSlider.opaque = 20.0;
UIImage *stetchLeftTrack = [[UIImage imageNamed:@"image3.png"]
stretchableImageWithLeftCapWidth:0.0 topCapHeight:0.0];
UIImage *stetchRightTrack = [[UIImage imageNamed:@"image2.png"]
stretchableImageWithLeftCapWidth:0.0 topCapHeight:0.0];
[customSlider setThumbImage: [UIImageimageNamed:@"image1.png"]forState:UIControlStateNormal];
[customSlider setMinimumTrackImage:stetchLeftTrack forState:UIControlStateNormal];
[customSlider setMaximumTrackImage:stetchRightTrack forState:UIControlStateNormal];
[customSlider thumbRectForBounds: thumb trackRect: frame value: customSlider.value];
customSlider.minimumValue = 0.0;
customSlider.maximumValue = 100.0;
customSlider.continuous = NO;
customSlider.value = 50.0;
customSlider.transform = CGAffineTransformRotate(customSlider.transform,270.0/180*M_PI);
-(void)sliderAction:(id)sender
UISlider *slider = (UISlider *)sender;
int progressAsInt = (int)(slider.value + 0.5f);
customSliderValue = [NSNumber numberWithInt:0];
customSliderValue = progressAsInt;
if (customSliderValue > 50)
[self myMethod1];
[customSlider setValue:100];
else
[self myMethod2];
[customSlider setValue:0];
【讨论】:
以上是关于iPhone 垂直拨动开关的主要内容,如果未能解决你的问题,请参考以下文章