2012-08-12 66 views
0

在过去的三天里,我一直在试图推出我自己的UISwitch,因为它是针对实际切换按钮和轨道的自定义图像自定义的。到目前为止,它已经导致了错误和难看的代码,并且它不能正常工作。自定义UISwitch?

由于我不想重新发明轮子,是否有任何方法或库可供我使用,以便使用我自己的UIImage自定义UISwitch?

回答

2

这是一个几乎完整的类UISwitch控制。由于它是开源的,您可以对它进行子类化或修改,以便使用图像对其进行定制。

https://github.com/domesticcatsoftware/DCRoundSwitch

+0

你肯定没有库已经具备的功能即时寻找实现? – 2012-08-12 18:34:29

+0

@iBradApps这是图书馆:)或者你可以自己做。 – 2012-08-12 18:34:54

+1

或查看下面详细介绍的图层方法。我不知道这是否是一种更好的方法,因为原作可能仍然在渲染之下。可能有一种方法可以禁用它。最后,我会采用最具可维护性和最佳性能的方式。 – Brian 2012-08-12 18:57:42

2

您可以使用层交换机的完全自定义的版本。

下面是一个简单的例子。您应该可以修改它以使用图像或您想要绘制的任何自定义图形。

代替标准外观开关,它使用红色和绿色填充指示开/关状态。它的行为与UISwitch相同,只是使用不同的图形。由于我们使用的是CALayer,所以颜色转换也为我们制作了动画。

//CustomSwitch.H 
#import <Foundation/Foundation.h> 


@interface CustomSwitch : UISwitch { 
    CALayer* uiLayer; 
} 

@end 

//CustomSwitch.m 

    #import "CustomSwitch.h" 
    #import "QuartzCore/QuartzCore.h" 

    @implementation CustomSwitch    

    -(id) initWithFrame:(CGRect)frame 
    { 
     self = [super initWithFrame:frame];     

     [self addTarget:self action:@selector(checked:) forControlEvents:UIControlEventValueChanged]; 
     if (NULL!=self) 
     { 
      [self customLayout]; 
     }   

     return self; 
    } 

    -(void) checked:(id) event 
    { 
     uiLayer.backgroundColor= [self isOn] ? [UIColor greenColor].CGColor : [UIColor redColor].CGColor;  
    } 

    -(void) customLayout 
    { 
     uiLayer = [CALayer layer];    
     uiLayer.frame = self.frame; 
     uiLayer.backgroundColor= [UIColor redColor ].CGColor;   
     [[self layer] addSublayer:uiLayer];    
    } 

    -(void)dealloc 
    { 
     [uiLayer release]; 
    } 

    @end 
+0

谢谢,这也是一个很好的技巧。 – 2012-08-12 21:43:32