


NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[NSFont fontWithName:@"Helvetica" size:12], NSFontAttributeName,[NSColor blackColor], NSForegroundColorAttributeName, nil];
NSAttributedString * currentText=[[NSAttributedString alloc] initWithString: @"some text" attributes: attributes];
Then you need to figure out where you will put the text :
dot = NSMakePoint( size_x/2 + cos (PI * mid_angle / 180 ) * 50 , size_y/2 + sin ( PI * mid_angle / 180 ) * 50 ) ;
[greenPath appendBezierPathWithArcWithCenter: dot radius: 2 startAngle: 0 endAngle: 360 ] ;
(This is the dot you see in the picture above)
The mid_angle is the angle of slice divided by 2.
Then you draw the text :
textStartPoint = makeTextStartingPoint( [currentText size], bounds , mid_angle, 50 ) ;
[currentText drawAtPoint:textStartPoint];
The function makeTextStartingPoint looks like follows :
NSPoint makeTextStartingPoint( NSSize textSize, NSRect bounds , float angle, int offset )
{
NSPoint textStartPoint ;
float size_x = bounds.size.width ;
float size_y = bounds.size.height ;
float angle_radian = PI * angle / 180 ;
if ( angle <= 90 )
{
textStartPoint = NSMakePoint( size_x/2 + cos (angle_radian) * offset + 5 , size_y/2 + sin (angle_radian ) * offset ) ;
}
if ( angle > 90 && angle <= 180)
{
textStartPoint = NSMakePoint( size_x/2 + cos ( angle_radian ) * offset - textSize.width - 5 , size_y/2 + sin (angle_radian ) * offset ) ;
}
if ( angle > 180 && angle <= 270 )
{
textStartPoint = NSMakePoint( size_x/2 + cos ( angle_radian ) * offset - textSize.width - 5, size_y/2 + sin ( angle_radian ) * offset - textSize.height ) ;
}
if ( angle > 270 )
{
textStartPoint = NSMakePoint( size_x/2 + cos ( angle_radian ) * offset + 8 , size_y/2 + sin (angle_radian ) * offset - textSize.height ) ;
}
return textStartPoint ;
}
The reason I use an attributed string is because now I get the length of the text in pixels. You also see that the starting point is different from quadrant to quadrant.




Instruction video of iSignals : http://www.youtube.com/watch?v=fd9nrEr-r7E


#import
@interface UIMultipleSelectionSegmentControl : UISegmentedControl {
NSMutableSet *indices ;
}
@property( nonatomic,retain) NSMutableSet *indices ;
@end
#import "UIMultipleSelectionSegmentControl.h"
@implementation UIMultipleSelectionSegmentControl
@synthesize indices ;
- (NSSet *) selectedSegmentIndices
{
return self.indices ;
}
- (void) setSelectedSegmentIndices: (NSSet *) aSet
{
NSEnumerator *enumerator = [aSet objectEnumerator];
NSNumber *value;
while ((value = [enumerator nextObject]))
{
[self setSelectedSegmentIndex: [value integerValue]] ;
}
}
- (void) setSelectedSegmentIndex: (NSInteger) anIndex
{
if ( self.indices == nil ) self.indices = [NSMutableSet set] ;
if ( anIndex >= 0 )
{
NSNumber *indexNumber ;
UIImage *myImage ;
indexNumber = [NSNumber numberWithInt: anIndex] ;
if ( ! [self.indices containsObject: indexNumber] )
{
[self.indices addObject: indexNumber] ;
switch( anIndex )
{
case 0 :myImage = [UIImage imageNamed: @"segment-5-sel.png"] ; break ;
case 1 :myImage = [UIImage imageNamed: @"segment-10-sel.png"] ; break ;
case 2 :myImage = [UIImage imageNamed: @"segment-20-sel.png"] ; break ;
case 3 :myImage = [UIImage imageNamed: @"segment-50-sel.png"] ; break ;
case 4 :myImage = [UIImage imageNamed: @"segment-100-sel.png"] ; break ;
case 5: myImage = [UIImage imageNamed: @"segment-200-sel.png"] ; break ;
}
[super setSelectedSegmentIndex: anIndex] ;
}
else
{
[self.indices removeObject: indexNumber] ;
[super setSelectedSegmentIndex: -indexNumber] ;
switch( anIndex )
{
case 0 :myImage = [UIImage imageNamed: @"segment-5.png"] ; break ;
case 1 :myImage = [UIImage imageNamed: @"segment-10.png"] ; break ;
case 2 :myImage = [UIImage imageNamed: @"segment-20.png"] ; break ;
case 3 :myImage = [UIImage imageNamed: @"segment-50.png"] ; break ;
case 4 :myImage = [UIImage imageNamed: @"segment-100.png"] ; break ;
case 5: myImage = [UIImage imageNamed: @"segment-200.png"] ; break ;
}
}
[self setImage: myImage forSegmentAtIndex: anIndex] ;
}
}
- (void)dealloc {
[indices release] ;
[super dealloc];
}
@end