两行 UISegmentedControl

发布于 2024-08-17 20:50:22 字数 122 浏览 4 评论 0原文

iPhone 上的 UISegmentedControl 是否可以跨两行?我已经在一些应用程序中看到了这一点,但没有在文档中找到我需要的内容。也许它是一个自定义的 UIButton,设计得像 UISegmentedControl。

Is it possible to have a UISegmentedControl span two rows on the iPhone? I've seen this done in a few apps, but not finding what I need in the documentation. Perhaps it's a custom UIButton designed to look like UISegmentedControl.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

昇り龍 2024-08-24 20:50:22

我也在找这个。

我什至希望第二行看起来像第一行的一部分,更像一个网格。
只能找到使用第二个 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

I was looking for this as well.

I even wanted the second row to look like a part of the first, more like a grid.
Could only find to use a second UISegmentedControl, and combined it with another trick to take care of the unnecessary rounded edges.


In my implementation I inherit from UIControl (inherits from UIView),
Added 2 UISegmentControls, 2 UIViews to clip the edges and make them look as one.

Further I make some adjustments to set the textfields visually back in the centre.

Easily expanded horizontally, and with minor effort a third,... row could be added too.

The header:

//  YHSegmentedGridControl.h
#import <UIKit/UIKit.h>

@interface YHSegmentedGridControl : UIControl{
    UISegmentedControl *a,*b;
    UIView *va,*vb;
}

- (void)setSelectedSegmentIndex:(NSInteger)index;
- (NSInteger)selectedSegmentIndex;

@end

In the .m file:

//  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;
}

The actual work:

-(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
挽梦忆笙歌 2024-08-24 20:50:22

使用标准 UISegmentedControl 是不可能的 - 您必须自己绘制它。

It's not possible using standard UISegmentedControl - you'll have to draw it on your own.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文