Quartz 2D 点线模式

12.2.3  点线模式(1)

使用Quartz 2D绘制线段或边框时,默认总是使用实线。如果希望使用点线进行绘制,可调用CGContextRef的CGContextSetLineDash(CGContextRef c,CGFloat phase, const CGFloat lengths[],size_t count)函数进行设置,该函数的第3个参数是点线模式的关键,该参数是一个CGFloat型数组(第4个参数通常用于指定该数组的长度),每个CGFloat值依次控制点线的实线长度、间距。比如该参数如下。

{2,3}:代表长为2的实线、距离为3的间距、长为2的实线、距离为3的间距……这种点线模式。

{2,3,1}:代表长为2的实线、距离为3的间距、长为1的实线、距离为2的间距、长为3的实线、距离为1的间距……这种点线模式。

{5,3,1,2}:代表长为5的实线、距离为3的间距、长为1的实线、距离为2的间距、长为5的实线、距离为3的间距、长为1的实线、距离为2的间距……这种点线模式。

通过第2个参数依次指定点线模式的实线长度、间距的重复模式,这样可以定义出任意形状的点线。

该方法的第2个参数用于指定点线的相位,该参数将会与第3个参数协同起作用,比如如下参数参数组合。

phase=1, lengths={2,3}:代表长为2的实线、距离为3的间距、长为2的实线、距离为3的间距。但开始绘制起点时只绘制长度为1的实线,因为phase为1就是控制该点线"移过"1个点。

phase=3, {5,3,1,2}:代表长为5的实线、距离为3的间距、长为1的实线、距离为2的间距、长为5的实线、距离为3的间距、长为1的实线、距离为2的间距。但开始绘制时只绘制长度为2的实线,因为phase为3就是控制该点线"移过"3个点。

下面介绍一个示例让读者对Quartz 2D的点线模式有更直观、深入的理解。首先创建一个Single View Application,该应用包含一个应用程序委托类、一个视图控制器类以及配套的Storyboard界面设计文件。为了通过该界面控制点线模式,在该界面上放置一个UISlider来控制phase参数,并添加一个按钮用于重设phase参数,还放置一个UIPickerView来控制lengths参数,该应用的设计界面如图12.3所示。
 

为了在程序中访问这些UI控件,将程序中的UIScrolllView绑定到控制器的scrollView IBOutlet属性,将UIPickerView绑定到控制器的picker IBOutlet属性,将UISlider绑定到phase IBOutlet属性,并为界面上按钮的Touch Up Inside事件绑定reset IBAction事件处理方法。

该控制器类的实现部分代码如下。

程序清单:codes/12/12.2/DashLineTest/DashLineTest/FKViewController.m
 

 
 
  1. @implementation FKViewController  
  2. typedef struct {  
  3.     CGFloat pattern[5];  
  4.     size_t count;  
  5. } Pattern;  
  6. // 初始化多个点线模式  
  7. static Pattern patterns[] = {  
  8.     {{10.0, 10.0}, 2},  
  9.     {{10.0, 20.0, 10.0}, 3},  
  10.     {{10.0, 20.0, 30.0}, 3},  
  11.     {{10.0, 20.0, 10.0, 30.0}, 4},  
  12.     {{10.0, 10.0, 20.0, 20.0}, 4},  
  13.     {{10.0, 10.0, 20.0, 30.0, 50.0}, 5},  
  14. };  
  15. static NSInteger patternCount = sizeof(patterns)  
  16.     / sizeof(patterns[0]);  
  17. FKDashLineView* dashView;  
  18. -(void)viewDidLoad  
  19. {  
  20.     [super viewDidLoad];  
  21.     // 创建FKDashLineView自定义控件  
  22.     dashView = [[FKDashLineView alloc] initWithFrame:self.scrollView.bounds];  
  23.     [self.scrollView addSubview: dashView];  // 将FKDashLineView控件添加到scrollView中  
  24.     [dashView setDashPattern:patterns[0].pattern  
  25.         count:patterns[0].count];  
  26.     // 为UIPickerView设置dataSource、delegate属性  
  27.     selfself.picker.dataSource = self;  
  28.     selfself.picker.delegate = self;  
  29.     // 选中UIPickerView的第一行  
  30.     [self.picker selectRow:0 inComponent:0 animated:NO];  
  31.     // 为UIPickerView的Value Changed事件绑定事件监听器  
  32.     [self.phase addTarget:self action:@selector(dashPhase)  
  33.          forControlEvents:UIControlEventValueChanged];  
  34. }  
  35. -(void)dashPhase  
  36. {  
  37.     // 将dashView的dahsPhase设置与UIPickerView的值相同  
  38.     dashView.dashPhase = self.phase.value;  
  39. }  
  40. -(IBAction)reset  
  41. {     
  42.     dashView.dashPhase = 0.0;  // 将dashView的dahsPhase设为0      
  43.     self.phase.value = 0.0;  // 将界面上UIPickerView控件的值也设为0  
  44. }  
  45. // 该方法的返回值控制UIPickerView只包含一列  
  46. -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView  
  47. {  
  48.     return 1;  
  49. }  
  50. // 该方法的返回值控制UIPickerView包含多少个列表项  
  51. -(NSInteger)pickerView:(UIPickerView *)pickerView  
  52.     numberOfRowsInComponent:(NSInteger)component  
  53. {  
  54.     return patternCount;  
  55. }  
  56. // 该方法的返回值决定每个列表项所显示的文本  
  57. -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:  
  58.     (NSInteger)row forComponent:(NSInteger)component;  
  59. {     
  60.     Pattern p = patterns[row];  // 获取patterns数组的第row个元素  
  61.     // 将第row个patterns数组元素的pattern成员所包含的count个值拼接起来  
  62.     // 作为第row个列表项所显示的文本  
  63.     NSMutableString *title = [NSMutableString  
  64.         stringWithFormat:@"%.0f", p.pattern[0]];  
  65.     for(size_t i = 1; i < p.count; ++i)  
  66.     {  
  67.         [title appendFormat:@"-%.0f", p.pattern[i]];  
  68.     }  
  69.     return title;  
  70. }  
  71. // 当用户选择UIPickView的指定列表项时,程序设置dashView的点线模式  
  72. -(void)pickerView:(UIPickerView *)pickerView didSelectRow:  
  73.     (NSInteger)row inComponent:(NSInteger)component  
  74. {  
  75.     [dashView setDashPattern:patterns[row].pattern  
  76.         count:patterns[row].count];  
  77. }  
  78. @end 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值