Двухрядный UISegmentedControl - PullRequest
       8

Двухрядный UISegmentedControl

2 голосов
/ 12 января 2010

Возможно ли, чтобы UISegmentedControl занимал две строки на iPhone? Я видел это в нескольких приложениях, но не нашел в документации то, что мне нужно. Возможно, это пользовательский UIButton, разработанный для UISegmentedControl.

Ответы [ 2 ]

1 голос
/ 22 апреля 2013

Я тоже искал это.

Я даже хотел, чтобы второй ряд выглядел как часть первого, больше как сетка. Может только найти использование второго 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
0 голосов
/ 12 января 2010

Невозможно использовать стандартный UISegmentedControl - вам придется нарисовать его самостоятельно.

...