17 #pragma mark Setup and teardown |
17 #pragma mark Setup and teardown |
18 |
18 |
19 |
19 |
20 - (id)initWithFrame:(CGRect)frame |
20 - (id)initWithFrame:(CGRect)frame |
21 { |
21 { |
22 if ((self = [super initWithFrame:frame])) { |
22 if ((self = [super initWithFrame:frame])) { |
23 self.userInteractionEnabled = NO; |
23 self.userInteractionEnabled = NO; |
24 self.allowsDragging = NO; |
24 self.allowsDragging = NO; |
25 self.contentMode = UIViewContentModeRedraw; |
25 self.contentMode = UIViewContentModeRedraw; |
26 } |
26 } |
27 return self; |
27 return self; |
28 } |
28 } |
29 |
29 |
30 |
30 |
31 - (void)dealloc |
31 - (void)dealloc |
32 { |
32 { |
33 self.splitViewController = nil; |
33 self.splitViewController = nil; |
34 [super dealloc]; |
34 [super dealloc]; |
35 } |
35 } |
36 |
36 |
37 |
37 |
38 #pragma mark - |
38 #pragma mark - |
39 #pragma mark Drawing |
39 #pragma mark Drawing |
40 |
40 |
41 |
41 |
42 - (void)drawRect:(CGRect)rect |
42 - (void)drawRect:(CGRect)rect |
43 { |
43 { |
44 if (splitViewController.dividerStyle == MGSplitViewDividerStyleThin) { |
44 if (splitViewController.dividerStyle == MGSplitViewDividerStyleThin) { |
45 [super drawRect:rect]; |
45 [super drawRect:rect]; |
46 |
46 |
47 } else if (splitViewController.dividerStyle == MGSplitViewDividerStylePaneSplitter) { |
47 } else if (splitViewController.dividerStyle == MGSplitViewDividerStylePaneSplitter) { |
48 // Draw gradient background. |
48 // Draw gradient background. |
49 CGRect bounds = self.bounds; |
49 CGRect bounds = self.bounds; |
50 CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB(); |
50 CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB(); |
51 CGFloat locations[2] = {0, 1}; |
51 CGFloat locations[2] = {0, 1}; |
52 CGFloat components[8] = { 0.988, 0.988, 0.988, 1.0, // light |
52 CGFloat components[8] = { 0.988, 0.988, 0.988, 1.0, // light |
53 0.875, 0.875, 0.875, 1.0 };// dark |
53 0.875, 0.875, 0.875, 1.0 };// dark |
54 CGGradientRef gradient = CGGradientCreateWithColorComponents (rgb, components, locations, 2); |
54 CGGradientRef gradient = CGGradientCreateWithColorComponents (rgb, components, locations, 2); |
55 CGContextRef context = UIGraphicsGetCurrentContext(); |
55 CGContextRef context = UIGraphicsGetCurrentContext(); |
56 CGPoint start, end; |
56 CGPoint start, end; |
57 if (splitViewController.vertical) { |
57 if (splitViewController.vertical) { |
58 // Light left to dark right. |
58 // Light left to dark right. |
59 start = CGPointMake(CGRectGetMinX(bounds), CGRectGetMidY(bounds)); |
59 start = CGPointMake(CGRectGetMinX(bounds), CGRectGetMidY(bounds)); |
60 end = CGPointMake(CGRectGetMaxX(bounds), CGRectGetMidY(bounds)); |
60 end = CGPointMake(CGRectGetMaxX(bounds), CGRectGetMidY(bounds)); |
61 } else { |
61 } else { |
62 // Light top to dark bottom. |
62 // Light top to dark bottom. |
63 start = CGPointMake(CGRectGetMidX(bounds), CGRectGetMinY(bounds)); |
63 start = CGPointMake(CGRectGetMidX(bounds), CGRectGetMinY(bounds)); |
64 end = CGPointMake(CGRectGetMidX(bounds), CGRectGetMaxY(bounds)); |
64 end = CGPointMake(CGRectGetMidX(bounds), CGRectGetMaxY(bounds)); |
65 } |
65 } |
66 CGContextDrawLinearGradient(context, gradient, start, end, 0); |
66 CGContextDrawLinearGradient(context, gradient, start, end, 0); |
67 CGColorSpaceRelease(rgb); |
67 CGColorSpaceRelease(rgb); |
68 CGGradientRelease(gradient); |
68 CGGradientRelease(gradient); |
69 |
69 |
70 // Draw borders. |
70 // Draw borders. |
71 float borderThickness = 1.0; |
71 float borderThickness = 1.0; |
72 [[UIColor colorWithWhite:0.7 alpha:1.0] set]; |
72 [[UIColor colorWithWhite:0.7 alpha:1.0] set]; |
73 CGRect borderRect = bounds; |
73 CGRect borderRect = bounds; |
74 if (splitViewController.vertical) { |
74 if (splitViewController.vertical) { |
75 borderRect.size.width = borderThickness; |
75 borderRect.size.width = borderThickness; |
76 UIRectFill(borderRect); |
76 UIRectFill(borderRect); |
77 borderRect.origin.x = CGRectGetMaxX(bounds) - borderThickness; |
77 borderRect.origin.x = CGRectGetMaxX(bounds) - borderThickness; |
78 UIRectFill(borderRect); |
78 UIRectFill(borderRect); |
79 |
79 |
80 } else { |
80 } else { |
81 borderRect.size.height = borderThickness; |
81 borderRect.size.height = borderThickness; |
82 UIRectFill(borderRect); |
82 UIRectFill(borderRect); |
83 borderRect.origin.y = CGRectGetMaxY(bounds) - borderThickness; |
83 borderRect.origin.y = CGRectGetMaxY(bounds) - borderThickness; |
84 UIRectFill(borderRect); |
84 UIRectFill(borderRect); |
85 } |
85 } |
86 |
86 |
87 // Draw grip. |
87 // Draw grip. |
88 [self drawGripThumbInRect:bounds]; |
88 [self drawGripThumbInRect:bounds]; |
89 } |
89 } |
90 } |
90 } |
91 |
91 |
92 |
92 |
93 - (void)drawGripThumbInRect:(CGRect)rect |
93 - (void)drawGripThumbInRect:(CGRect)rect |
94 { |
94 { |
95 float width = 9.0; |
95 float width = 9.0; |
96 float height; |
96 float height; |
97 if (splitViewController.vertical) { |
97 if (splitViewController.vertical) { |
98 height = 30.0; |
98 height = 30.0; |
99 } else { |
99 } else { |
100 height = width; |
100 height = width; |
101 width = 30.0; |
101 width = 30.0; |
102 } |
102 } |
103 |
103 |
104 // Draw grip in centred in rect. |
104 // Draw grip in centred in rect. |
105 CGRect gripRect = CGRectMake(0, 0, width, height); |
105 CGRect gripRect = CGRectMake(0, 0, width, height); |
106 gripRect.origin.x = ((rect.size.width - gripRect.size.width) / 2.0); |
106 gripRect.origin.x = ((rect.size.width - gripRect.size.width) / 2.0); |
107 gripRect.origin.y = ((rect.size.height - gripRect.size.height) / 2.0); |
107 gripRect.origin.y = ((rect.size.height - gripRect.size.height) / 2.0); |
108 |
108 |
109 float stripThickness = 1.0; |
109 float stripThickness = 1.0; |
110 UIColor *stripColor = [UIColor colorWithWhite:0.35 alpha:1.0]; |
110 UIColor *stripColor = [UIColor colorWithWhite:0.35 alpha:1.0]; |
111 UIColor *lightColor = [UIColor colorWithWhite:1.0 alpha:1.0]; |
111 UIColor *lightColor = [UIColor colorWithWhite:1.0 alpha:1.0]; |
112 float space = 3.0; |
112 float space = 3.0; |
113 if (splitViewController.vertical) { |
113 if (splitViewController.vertical) { |
114 gripRect.size.width = stripThickness; |
114 gripRect.size.width = stripThickness; |
115 [stripColor set]; |
115 [stripColor set]; |
116 UIRectFill(gripRect); |
116 UIRectFill(gripRect); |
117 |
117 |
118 gripRect.origin.x += stripThickness; |
118 gripRect.origin.x += stripThickness; |
119 gripRect.origin.y += 1; |
119 gripRect.origin.y += 1; |
120 [lightColor set]; |
120 [lightColor set]; |
121 UIRectFill(gripRect); |
121 UIRectFill(gripRect); |
122 gripRect.origin.x -= stripThickness; |
122 gripRect.origin.x -= stripThickness; |
123 gripRect.origin.y -= 1; |
123 gripRect.origin.y -= 1; |
124 |
124 |
125 gripRect.origin.x += space + stripThickness; |
125 gripRect.origin.x += space + stripThickness; |
126 [stripColor set]; |
126 [stripColor set]; |
127 UIRectFill(gripRect); |
127 UIRectFill(gripRect); |
128 |
128 |
129 gripRect.origin.x += stripThickness; |
129 gripRect.origin.x += stripThickness; |
130 gripRect.origin.y += 1; |
130 gripRect.origin.y += 1; |
131 [lightColor set]; |
131 [lightColor set]; |
132 UIRectFill(gripRect); |
132 UIRectFill(gripRect); |
133 gripRect.origin.x -= stripThickness; |
133 gripRect.origin.x -= stripThickness; |
134 gripRect.origin.y -= 1; |
134 gripRect.origin.y -= 1; |
135 |
135 |
136 gripRect.origin.x += space + stripThickness; |
136 gripRect.origin.x += space + stripThickness; |
137 [stripColor set]; |
137 [stripColor set]; |
138 UIRectFill(gripRect); |
138 UIRectFill(gripRect); |
139 |
139 |
140 gripRect.origin.x += stripThickness; |
140 gripRect.origin.x += stripThickness; |
141 gripRect.origin.y += 1; |
141 gripRect.origin.y += 1; |
142 [lightColor set]; |
142 [lightColor set]; |
143 UIRectFill(gripRect); |
143 UIRectFill(gripRect); |
144 |
144 |
145 } else { |
145 } else { |
146 gripRect.size.height = stripThickness; |
146 gripRect.size.height = stripThickness; |
147 [stripColor set]; |
147 [stripColor set]; |
148 UIRectFill(gripRect); |
148 UIRectFill(gripRect); |
149 |
149 |
150 gripRect.origin.y += stripThickness; |
150 gripRect.origin.y += stripThickness; |
151 gripRect.origin.x -= 1; |
151 gripRect.origin.x -= 1; |
152 [lightColor set]; |
152 [lightColor set]; |
153 UIRectFill(gripRect); |
153 UIRectFill(gripRect); |
154 gripRect.origin.y -= stripThickness; |
154 gripRect.origin.y -= stripThickness; |
155 gripRect.origin.x += 1; |
155 gripRect.origin.x += 1; |
156 |
156 |
157 gripRect.origin.y += space + stripThickness; |
157 gripRect.origin.y += space + stripThickness; |
158 [stripColor set]; |
158 [stripColor set]; |
159 UIRectFill(gripRect); |
159 UIRectFill(gripRect); |
160 |
160 |
161 gripRect.origin.y += stripThickness; |
161 gripRect.origin.y += stripThickness; |
162 gripRect.origin.x -= 1; |
162 gripRect.origin.x -= 1; |
163 [lightColor set]; |
163 [lightColor set]; |
164 UIRectFill(gripRect); |
164 UIRectFill(gripRect); |
165 gripRect.origin.y -= stripThickness; |
165 gripRect.origin.y -= stripThickness; |
166 gripRect.origin.x += 1; |
166 gripRect.origin.x += 1; |
167 |
167 |
168 gripRect.origin.y += space + stripThickness; |
168 gripRect.origin.y += space + stripThickness; |
169 [stripColor set]; |
169 [stripColor set]; |
170 UIRectFill(gripRect); |
170 UIRectFill(gripRect); |
171 |
171 |
172 gripRect.origin.y += stripThickness; |
172 gripRect.origin.y += stripThickness; |
173 gripRect.origin.x -= 1; |
173 gripRect.origin.x -= 1; |
174 [lightColor set]; |
174 [lightColor set]; |
175 UIRectFill(gripRect); |
175 UIRectFill(gripRect); |
176 } |
176 } |
177 } |
177 } |
178 |
178 |
179 |
179 |
180 #pragma mark - |
180 #pragma mark - |
181 #pragma mark Interaction |
181 #pragma mark Interaction |
182 |
182 |
183 |
183 |
184 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event |
184 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event |
185 { |
185 { |
186 UITouch *touch = [touches anyObject]; |
186 UITouch *touch = [touches anyObject]; |
187 if (touch) { |
187 if (touch) { |
188 CGPoint lastPt = [touch previousLocationInView:self]; |
188 CGPoint lastPt = [touch previousLocationInView:self]; |
189 CGPoint pt = [touch locationInView:self]; |
189 CGPoint pt = [touch locationInView:self]; |
190 float offset = (splitViewController.vertical) ? pt.x - lastPt.x : pt.y - lastPt.y; |
190 float offset = (splitViewController.vertical) ? pt.x - lastPt.x : pt.y - lastPt.y; |
191 if (!splitViewController.masterBeforeDetail) { |
191 if (!splitViewController.masterBeforeDetail) { |
192 offset = -offset; |
192 offset = -offset; |
193 } |
193 } |
194 splitViewController.splitPosition = splitViewController.splitPosition + offset; |
194 splitViewController.splitPosition = splitViewController.splitPosition + offset; |
195 } |
195 } |
196 } |
196 } |
197 |
197 |
198 |
198 |
199 #pragma mark - |
199 #pragma mark - |
200 #pragma mark Accessors and properties |
200 #pragma mark Accessors and properties |
201 |
201 |
202 |
202 |
203 - (void)setAllowsDragging:(BOOL)flag |
203 - (void)setAllowsDragging:(BOOL)flag |
204 { |
204 { |
205 if (flag != allowsDragging) { |
205 if (flag != allowsDragging) { |
206 allowsDragging = flag; |
206 allowsDragging = flag; |
207 self.userInteractionEnabled = allowsDragging; |
207 self.userInteractionEnabled = allowsDragging; |
208 } |
208 } |
209 } |
209 } |
210 |
210 |
211 |
211 |
212 @synthesize splitViewController; |
212 @synthesize splitViewController; |
213 @synthesize allowsDragging; |
213 @synthesize allowsDragging; |