【发布时间】:2013-04-22 21:16:52
【问题描述】:
是否可以让 UISegmentedControl 在 iPhone 上跨两行?我已经在一些应用程序中看到了这一点,但在文档中没有找到我需要的东西。也许它是一个自定义的 UIButton,旨在看起来像 UISegmentedControl。
【问题讨论】:
标签: iphone uikit uisegmentedcontrol
是否可以让 UISegmentedControl 在 iPhone 上跨两行?我已经在一些应用程序中看到了这一点,但在文档中没有找到我需要的东西。也许它是一个自定义的 UIButton,旨在看起来像 UISegmentedControl。
【问题讨论】:
标签: iphone uikit uisegmentedcontrol
我也在找这个。
我什至希望第二行看起来像第一行的一部分,更像是一个网格。 只能找到使用第二个 UISegmentedControl,并将其与另一个技巧结合起来处理不必要的圆角。
在我的实现中,我继承自 UIControl(继承自 UIView), 添加了 2 个 UISegmentControls、2 个 UIViews 来剪辑边缘并使它们看起来像一个。
我进一步进行了一些调整,以将文本字段视觉设置回中心。
水平扩展很容易,也可以轻松地添加第三行...。
标题:
// YHSegmentedGridControl.h
#import <UIKit/UIKit.h>
@interface YHSegmentedGridControl : UIControl{
UISegmentedControl *a,*b;
UIView *va,*vb;
}
- (void)setSelectedSegmentIndex:(NSInteger)index;
- (NSInteger)selectedSegmentIndex;
@end
.m 文件中:
// YHSegmentedGridControl.m
// UITestSegment2D
// Created by Yh on 22/04/13.
#import "YHSegmentedGridControl.h"
@implementation YHSegmentedGridControl
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[self initWithDefaults];
}
return self;
}
实际工作:
-(void) initWithDefaults{
a = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects: @"1", @"2", nil]];
b = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects: @"3", @"4", nil]];
float e = 75;
int d = (int)e/7;
[a setFrame:CGRectMake(0, 0, 2*e, e+2*d)];
[b setFrame:CGRectMake(0, -2*d, 2*e, e+2*d)];
[a setContentOffset:CGSizeMake(0, -d) forSegmentAtIndex:0];
[a setContentOffset:CGSizeMake(0, -d) forSegmentAtIndex:1];
[b setContentOffset:CGSizeMake(0, +d) forSegmentAtIndex:0];
[b setContentOffset:CGSizeMake(0, +d) forSegmentAtIndex:1];
[a addTarget:self
action:@selector(pickOne:)
forControlEvents:UIControlEventValueChanged];
[b addTarget:self
action:@selector(pickOne:)
forControlEvents:UIControlEventValueChanged];
va = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 2*e, e)];
vb = [[UIView alloc] initWithFrame:CGRectMake(0, e, 2*e, e)];
[va setClipsToBounds:YES];
[vb setClipsToBounds:YES];
[self setFrame:CGRectMake(0,0,2*e,2*e)];
[va addSubview:a];
[vb addSubview:b];
[self addSubview:va];
[self addSubview:vb];
}
- (void)setSelectedSegmentIndex:(NSInteger)index{
if(index == UISegmentedControlNoSegment){
[a setSelectedSegmentIndex:UISegmentedControlNoSegment];
[b setSelectedSegmentIndex:UISegmentedControlNoSegment];
} else if(index < a.numberOfSegments){
[a setSelectedSegmentIndex:index];
[b setSelectedSegmentIndex:UISegmentedControlNoSegment];
} else if(index < ( a.numberOfSegments + b.numberOfSegments )){
[b setSelectedSegmentIndex:(index - a.numberOfSegments)];
[a setSelectedSegmentIndex:UISegmentedControlNoSegment];
}else
NSLog(@"No such segment: index to high");
}
- (NSInteger)selectedSegmentIndex{
if(a.selectedSegmentIndex != UISegmentedControlNoSegment)
return a.selectedSegmentIndex;
else if(b.selectedSegmentIndex != UISegmentedControlNoSegment)
return b.selectedSegmentIndex + a.numberOfSegments;
else
return UISegmentedControlNoSegment;
return 0;
}
- (void)pickOne:(id)sender{
if(sender == a)
[b setSelectedSegmentIndex:UISegmentedControlNoSegment];
if(sender == b)
[a setSelectedSegmentIndex:UISegmentedControlNoSegment];
//notify
[self sendActionsForControlEvents:UIControlEventValueChanged];
}
@end
【讨论】:
使用标准 UISegmentedControl 是不可能的 - 你必须自己绘制。
【讨论】: