自定义的NSSegmentedControl
1529
https://github.com/peterpaulis/M6SelectOneSegmentedControl
NSSegmentedControl 是一个切换控件,包含的每一个 可点选项 为一个 segment
。
创建
- (void)addSegVC{
NSSegmentedControl *segControl = [[NSSegmentedControl alloc]init];
segControl.frame = NSMakeRect(100, 100, 200, 100);
[self.window.contentView addSubview:segControl];
}
添加 segment
注意说明
- 没有直接添加 segment 数组的方法,而是先添加数据、再依次设置每个 segment 的值。
- 如果没有设置 segmentCount,即使设置了每个segment 也不会显示。
1、segment 为文字
segControl.segmentCount = 3;
[segControl setLabel:@"一" forSegment:0];
获取方法: labelForSegment:
2、segment 为图片
[segControl setImage:[NSImage imageNamed:NSImageNameUser] forSegment:1];
[segControl setImageScaling:NSImageScaleProportionallyDown forSegment:1];
3、segment 为menu
NSMenu *subMenu = [[NSMenu alloc] initWithTitle:@"Load_TEXT"];
[subMenu addItemWithTitle:@"Load1"action:@selector(load1) keyEquivalent:@"E"];
[subMenu addItemWithTitle:@"Load2"action:@selector(load2) keyEquivalent:@"R"];
[segControl setLabel:@"menu" forSegment:3];
[segControl setMenu:subMenu forSegment:3];
[segControl setWidth:100 forSegment:3];
[self.window.contentView addSubview:segControl];
注意:
- 如果点击时,目录项显示为灰色,点击无效。可能是这个 menuitem 绑定的 action 没有实现。
- 即使 menu 实现了
initWithTitle
方法,在 segment 上还是不会显示标题,依然需要使用setLabel
来设置标题。如下:
添加监听 setAction
[segControl setAction:@selector(segmentControlChange:)];
- (void)segmentControlChange:(NSSegmentedControl *)segControl{
NSLog(@"tag : %d , selectedSegment : %d",segControl.tag,segControl.selectedSegment);
}
设置 segment 尺寸
设置好了每个 item 后,segment 的宽度并不会自动均分。只会对文字和图片自然包裹后显示。如上面设置后,显示如下:
需要依次设置 width:
[segControl setWidth:60 forSegment:0];
segmentStyle 样式
segControl.segmentStyle = i;
NSSegmentStyle 枚举
typedef NS_ENUM(NSInteger, NSSegmentStyle) {
NSSegmentStyleAutomatic = 0,
NSSegmentStyleRounded = 1,
NSSegmentStyleRoundRect = 3,
NSSegmentStyleTexturedSquare = 4,
NSSegmentStyleSmallSquare = 6,
NSSegmentStyleSeparated NS_ENUM_AVAILABLE_MAC(10_10) = 8,
/* In Mac OS X 10.7, 下面样式建议使用 NSSegmentStyleTexturedSquare 代替*/
NSSegmentStyleTexturedRounded NS_ENUM_AVAILABLE_MAC(10_5) = 2,
NSSegmentStyleCapsule NS_ENUM_AVAILABLE_MAC(10_5) = 5
}
NSSegmentSwitchTracking 枚举
NSSegmentSwitchTracking 决定了点击的结果和样式。
typedef NS_ENUM(NSUInteger, NSSegmentSwitchTracking) {
NSSegmentSwitchTrackingSelectOne = 0, //单选
NSSegmentSwitchTrackingSelectAny = 1,
//可以多选,选中后 selectedSegment 只是最后一个 index,而非 indexArray
NSSegmentSwitchTrackingMomentary = 2,
//点击时,才选中,selectedSegment : index ;点击停止后,就不会再选中,selectedSegment : 0
NSSegmentSwitchTrackingMomentaryAccelerator
//点击时,才选中,selectedSegment : index ;点击停止后,就不会再选中,selectedSegment : -1
};