【问题标题】:Two row UISegmentedControl两行 UISegmentedControl
【发布时间】:2013-04-22 21:16:52
【问题描述】:

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

【问题讨论】:

    标签: iphone uikit uisegmentedcontrol


    【解决方案1】:

    我也在找这个。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 2011-08-02
        • 2016-12-17
        • 1970-01-01
        • 2014-07-02
        • 1970-01-01
        相关资源
        最近更新 更多