iOS中创建表格类视图WBDataGridView的实例代码

时间:2022-06-30 01:34:11

iOS中创建表格类视图WBDataGridView的实例代码

项目中创建表格, 引用头文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#import "wbdatagridview.h"
- (void)viewdidload{
  [superviewdidload];
  // do any additional setup after loading the view.
  self.view.backgroundcolor = [uicolorwhitecolor];
  cgfloat margin = 10.f;
  cgfloat width = self.view.frame.size.width -2*margin;
  // - 添加表格 - 两列
  wbdatagridview *datagrid = [[wbdatagridviewalloc] initwithframe:cgrectmake(margin,4*margin , width, 0)
                            andcolumnswidths:@[@(width*0.4),@(width*0.6)]];
  datagrid.roundcorner = yes;
  [datagrid addrecord:@[@"姓名",@"dylan_lwb_"]];
  [datagrid addrecord:@[@"性别",@"男"]];
  [datagrid addrecord:@[@"电话",@"110119120"]];
  [datagrid addrecord:@[@"邮箱",@"dylan_lwb@163.com"]];
  [self.viewaddsubview:datagrid];
  // - 添加表格 - 多列
  wbdatagridview *moredatagrid = [[wbdatagridviewalloc]initwithframe:cgrectmake(margin,cgrectgetmaxy(datagrid.frame) +2*margin , width, 0)
                              andcolumnswidths:@[@(width*0.2),@(width*0.2),@(width*0.2),@(width*0.4)]];
  moredatagrid.roundcorner = yes;
  [moredatagrid addrecord:@[@"姓名",@"姓名",@"姓名",@"dylan_lwb_"]];
  [moredatagrid addrecord:@[@"性别",@"性别",@"性别",@"男"]];
  [moredatagrid addrecord:@[@"电话",@"电话",@"电话",@"110119120"]];
  [moredatagrid addrecord:@[@"邮箱",@"邮箱",@"邮箱",@"dylan_lwb@163.com"]];
  [self.viewaddsubview:moredatagrid];
}
// wbdatagridview.h
#import <uikit/uikit.h>
extern nsstring *const switchbuttonstring;
@interface wbdatagridview : uiview
@property (retain,nonatomic) nsarray *columnswidths;
@property (assign,nonatomic) nsuinteger lastrowheight;
@property (retain,nonatomic) uiimage *selectedimage;
@property (retain,nonatomic) uiimage *unselectedimage;
@property (assign,nonatomic) bool roundcorner;
- (id)initwithframe:(cgrect)frame andcolumnswidths:(nsarray*)columns;
- (void)addrecord:(nsarray*)record;
- (nsuinteger)selectedindex;
@end
// wbdatagridview.m
#import "wbdatagridview.h"
nsstring * const switchbuttonstring =@"switchbuttonstring";
@interface wbdatagridview ()
@property (assign,nonatomic) nsuinteger numrows;
@property (assign,nonatomic) nsuinteger dy;
@property (retain,nonatomic) nsmutablearray *switchbuttons;
@end
@implementation wbdatagridview
- (id)initwithframe:(cgrect)frame andcolumnswidths:(nsarray*)columns{
  self = [superinitwithframe:frame];
  if (self)
  {
    self.numrows =0;
    self.columnswidths = columns;
    self.dy =0;
    self.numrows =0;
    self.switchbuttons = [nsmutablearrayarray];
  }
  return self;
}
- (void)addrecord: (nsarray*)record
{
  if(record.count !=self.columnswidths.count)
  {
    nslog(@"!!! number of items does not match number of columns. !!!");
    return;
  }
  self.lastrowheight =42;
  uint dx = 0;
  nsmutablearray* labels = [nsmutablearrayarray];
  // - create the items/columns of the row
  for(uint i=0; i<record.count; i++)
  {
    float colwidth = [[self.columnswidthsobjectatindex:i] floatvalue];//colwidth as given at setup
    cgrect rect = cgrectmake(dx, self.dy, colwidth,self.lastrowheight);
    // - adjust x for border overlapping between columns
    if(i>0)
    {
      rect.origin.x -= i;
    }
    nsstring *onerecord = [record objectatindex:i];
    if ([onerecord isequaltostring:switchbuttonstring])
    {
      // - set the switch button string as empty, create a label to adjust a cell first, then add the switch upon the label
      onerecord = @"";
    }
    uilabel* col1 = [[uilabelalloc] init];
    [col1.layersetbordercolor:[[uicolorcolorwithwhite:0.821alpha:1.000]cgcolor]];
    [col1.layer setborderwidth:1.0];
    col1.font = [uifontfontwithname:@"helvetica"size:self.numrows ==0 ? 14.0f :12.0f];
    col1.textcolor = [uicolordarkgraycolor];
    col1.frame = rect;
    // - round corner
    if ([selfisroundcorner:i])
    {
      col1.layer.cornerradius =5;
      col1.layer.maskstobounds =yes;
    }
    // - set left reght margins&alignment for the label
    nsmutableparagraphstyle *style = [[nsparagraphstyledefaultparagraphstyle]mutablecopy];
    style.alignment =nstextalignmentcenter;
    nsattributedstring *attrtext = [[nsattributedstringalloc]initwithstring:onerecordattributes:@{nsparagraphstyleattributename : style}];
    col1.linebreakmode =nslinebreakbycharwrapping;
    col1.numberoflines = 0;
    col1.attributedtext = attrtext;
    [col1 sizetofit];
    // - used to find height of longest label
    cgfloat h = col1.frame.size.height +10;
    if(h > self.lastrowheight){
      self.lastrowheight = h;
    }
    // - make the label width same as columns's width
    rect.size.width = colwidth;
    col1.frame = rect;
    [labels addobject:col1];
    // - used for setting the next column x position
    dx += colwidth;
  }
  // - make all the labels of same height and then add to view
  for(uint i=0; i<labels.count; i++)
  {
    uilabel* templabel = (uilabel*)[labelsobjectatindex:i];
    cgrect temprect = templabel.frame;
    temprect.size.height =self.lastrowheight;
    templabel.frame = temprect;
    [self addsubview:templabel];
  }
  // - add the switch button at the first column in current row
  if ([record.firstobjectisequaltostring:switchbuttonstring])
  {
    uilabel *firstlabel = labels.firstobject;
    uibutton *oneswitchbutton = [[uibuttonalloc] initwithframe:cgrectmake(0,0, [self.columnswidths.firstobjectintegervalue], 40)];
    oneswitchbutton.center = firstlabel.center;
    [oneswitchbutton addtarget:selfaction:@selector(tapedswitchbutton:)forcontrolevents:uicontroleventtouchupinside];
    [oneswitchbutton setbackgroundimage:self.selectedimageforstate:uicontrolstateselected];
    [oneswitchbutton setbackgroundimage:self.unselectedimageforstate:uicontrolstatenormal];
    [self.switchbuttonsaddobject:oneswitchbutton];
    // - default selected first row button
    if (self.switchbuttons.firstobject == oneswitchbutton)
    {
      oneswitchbutton.selected = yes;
    }
    [self addsubview:oneswitchbutton];
  }
  self.numrows++;
  // - adjust y for border overlapping beteen rows
  self.dy +=self.lastrowheight-1;
  cgrect temprect = self.frame;
  temprect.size.height =self.dy;
  self.frame = temprect;
}
- (void)tapedswitchbutton:(uibutton *)button
{
  button.selected = !button.selected;
  [self.switchbuttonsenumerateobjectsusingblock:^(id obj,nsuinteger idx, bool *stop) {
    uibutton *onebutton = obj;
    if (onebutton != button)
    {
      onebutton.selected = no;
    }
  }];
}
- (nsuinteger)selectedindex
{
  __block nsuinteger index =0;
  [self.switchbuttonsenumerateobjectsusingblock:^(id obj,nsuinteger idx, bool *stop) {
    uibutton *onebutton = obj;
    if (onebutton.selected ==yes)
    {
      index = idx;
      *stop = yes;
    }
  }];
  return index;
}
- (bool)isroundcorner:(nsinteger)row
{
  return no;
}
@end

以上所述是小编给大家介绍的ios中创建表格类视图wbdatagridview的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:http://www.cnblogs.com/rglmuselily/archive/2017/02/10/6385261.html