【问题标题】:How to programmatically add a UISegmentedControl to a container view如何以编程方式将 UISegmentedControl 添加到容器视图
【发布时间】:2011-10-05 00:20:24
【问题描述】:

如何定义UISegmentedControl 的框架? 我希望分段控件出现在container view 的底部,即UIView

【问题讨论】:

标签: ios objective-c iphone swift uisegmentedcontrol


【解决方案1】:

这个是完美的,我测试过.....

UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 435)];
scroll.contentSize = CGSizeMake(320, 700);
scroll.showsHorizontalScrollIndicator = YES;

NSArray *itemArray = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:itemArray];
segmentedControl.frame = CGRectMake(35, 200, 250, 50);
segmentedControl.segmentedControlStyle = UISegmentedControlStylePlain;
[segmentedControl addTarget:self action:@selector(MySegmentControlAction:) forControlEvents: UIControlEventValueChanged];
segmentedControl.selectedSegmentIndex = 1;     
[scroll addSubview:segmentedControl];
[segmentedControl release]; 
[self.view addSubview:scroll];

然后在你的类中添加你的方法。

- (void)MySegmentControlAction:(UISegmentedControl *)segment 
{    
    if(segment.selectedSegmentIndex == 0)
    {
        // code for the first button
    } 
}

对于已弃用的 UISegmentedControlStyle,您可以查看 this 网址。

【讨论】:

  • 如果您成功了,请将此答案标记为正确,以便对其他人有所帮助。
  • 2年快过去了,但答案仍然没有被接受!不过帮了我!谢谢!
  • 完全被低估了。这是我的 +1。
  • 不错!只是一个快速更新:segmentedControlStyle 现在在 ios7 上已贬值
  • @SOFY 我认为他已经死亡或入狱,因为答案不被接受。 :-)
【解决方案2】:

Swift 4.x 的更新答案:

class SegmentClass: UIViewController {
    func addControl()  {
        let items = ["Uno", "Dos", "Tres"]
        let segmentedControl = UISegmentedControl(items: items)
        segmentedControl.frame = CGRect(x: 35, y: 200, width: 250, height: 50)
        segmentedControl.addTarget(self, action: #selector(segmentAction(_:)), for: .valueChanged)
        segmentedControl.selectedSegmentIndex = 1
        view.addSubview(segmentedControl)
    }

    @objc func segmentAction(_ segmentedControl: UISegmentedControl) {
        switch (segmentedControl.selectedSegmentIndex) {
        case 0:
            break // Uno
        case 1:
            break // Dos
        case 2:
            break // Tres
        default:
            break
        }
    }
}

Objective-C 中的原始答案:

NSArray *itemArray = [NSArray arrayWithObjects: @"Uno", @"Dos", @"Tres", nil];
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:itemArray];
segmentedControl.frame = CGRectMake(35, 200, 250, 50);
[segmentedControl addTarget:self action:@selector(segmentAction:) forControlEvents: UIControlEventValueChanged];
segmentedControl.selectedSegmentIndex = 1;
[self.view addSubview:segmentedControl];
  1. 创建一个数组来存储段的值
  2. 使用数组初始化段
  3. 在屏幕上为其分配一个位置并调整控件的大小
  4. 将其指向在用户与其交互时调用的方法
  5. 选择一个默认值(在本例中为 Dos)
  6. 将其放在主视图上

然后创建当用户更改值时调用的segmentAction方法

- (void)segmentAction:(UISegmentedControl *)segment
{
    switch (segment.selectedSegmentIndex) {
        case 0:
            // Uno
            break;
        case 1:
            // Dos
            break;
        case 2:
            // Tres
            break;
        default:
            break;
    }
}

我只是更喜欢 switch 语句,因为它看起来更简洁。您可以通过创建一个枚举并将其中的值用于选项 (optionUno,optionDos,optionTres) 而不是 0,1,2 来改进它。

【讨论】:

    【解决方案3】:

    斯威夫特:

    let items = ["All Fruits", "Orange", "Grapes", "Banana"]
    let filtersSegment = UISegmentedControl(items: items)
    filtersSegment.frame = CGRect.init(x: 0, y: 0, width: 300, height: 50)
    filtersSegment.selectedSegmentIndex = 0
    filtersSegment.tintColor = UIColor.black
    filtersSegment.addTarget(self, action: #selector(self.filterApply), for: UIControlEvents.valueChanged)
    self.view.addSubview(filterSegment)
    
    @objc private func filterApply(segment: UISegmentedControl) -> Void {
        switch segment.selectedSegmentIndex {
        case 1:
            //Do something for Orange
        case 2:
            //Do something for Grapes
        case 3:
            //Do something for Banana
        default:
            //Do something for All Fruits
        }
    }
    

    【讨论】:

      【解决方案4】:

      试试这个链接:

      ADDING A SEGMENTED CONTROL PROGRAMMATICALLY

      更新:

      import UIKit
      
      class ViewController: UIViewController {
      
        /**
          Loads the view and in our case we override default loadView to provide
          custom SegmentedControl.
        */
        override func loadView() {
            super.loadView()
            self.view.backgroundColor = UIColor.purpleColor()
      
            println("Main view's loadView() called.")
      
            // Initialize
            let items = ["Purple", "Green", "Blue"]
            let customSC = UISegmentedControl(items: items)
            customSC.selectedSegmentIndex = 0
      
            // Set up Frame and SegmentedControl
            let frame = UIScreen.mainScreen().bounds
            customSC.frame = CGRectMake(frame.minX + 10, frame.minY + 50,
                                        frame.width - 20, frame.height*0.1)
      
            // Style the Segmented Control
            customSC.layer.cornerRadius = 5.0  // Don't let background bleed
            customSC.backgroundColor = UIColor.blackColor()
            customSC.tintColor = UIColor.whiteColor()
      
            // Add target action method
            customSC.addTarget(self, action: "changeColor:", forControlEvents: .ValueChanged)
      
            // Add this custom Segmented Control to our view
            self.view.addSubview(customSC)
        }
      
        /**
          Handler for when custom Segmented Control changes and will change the
          background color of the view depending on the selection.
         */
        func changeColor(sender: UISegmentedControl) {
            println("Change color handler is called.")
            print("Changing Color to ")
            switch sender.selectedSegmentIndex {
            case 1:
                self.view.backgroundColor = UIColor.greenColor()
                println("Green")
            case 2:
                self.view.backgroundColor = UIColor.blueColor()
                println("Blue")
            default:
                self.view.backgroundColor = UIColor.purpleColor()
                println("Purple")
            }
        }
      
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
        }
      
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
      }
      

      来源:http://www.richardhsu.me/

      【讨论】:

        【解决方案5】:

        要以编程方式将 UISegmentedControl 添加到容器视图,请执行以下步骤:

        // Create UISegmentedControl object to add control UISegment.
        UISegmentedControl *objSegment = [[UISegmentedControl alloc] initWithItems:array];
        
        // Set frame for objSegment Control (formate: (x, y, width, height)). where, y = (height of view - height of control). 
        [objSegment setFrame:CGRectMake(0, (self.view.frame.size.height - 40), 320, 40)];
        
        // handle UISegmentedControl action.
        [objSegment addTarget:self action:@selector(handleSegmentControl:) forControlEvents: UIControlEventValueChanged];
        
         // Add your UISegmentedControl in your view.
        [self.view addSubview:objSegment];
        

        如有任何疑问,请联系我。

        【讨论】:

          【解决方案6】:

          这适用于所有类型的 iOS 设备:

          UISegment *segment = [[UISegmentedControl alloc] initWithItems:array];
          segment.frame = CGRectMake(0, self.view.frame.size.height - 40, 300, 40);
          UIFont *font = [UIFont fontWithName:@"DroidSans" size:18.0f];
          NSDictionary *attributes = [NSDictionary dictionaryWithObject:font
                                                                 forKey:NSFontAttributeName];
          [segment setTitleTextAttributes:attributes
                                          forState:UIControlStateNormal];
          [segment addTarget:self action:@selector(segmentAction:) forControlEvents: UIControlEventValueChanged];
          [self.view addSubview:segment];
          

          【讨论】:

            【解决方案7】:

            第 1 步。使用索引值创建分段控件

            - (void)viewDidLoad
            {
                [super viewDidLoad];
                self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"common-bg.jpg"]];
                [self.navigationItem setHidesBackButton:YES];
            
                //-- For creating segment control in navigation bar
                 UISegmentedControl *mainSegment = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Back", @"Month", @"Year", @"Home", nil]];
                [mainSegment setSegmentedControlStyle:UISegmentedControlStyleBar];
                mainSegment.frame = CGRectMake(0,0, 400, 43);
                self.navigationItem.titleView = mainSegment;
                mainSegment.selectedSegmentIndex = 1;
                [mainSegment addTarget:self action:@selector(mainSegmentControl:) forControlEvents: UIControlEventValueChanged];
                [self.view addSubview:mainSegment];
                //--**--
            
            }
            

            第 2 步。 创建子视图

            - (void)mainSegmentControl:(UISegmentedControl *)segment
            {
            
                if(segment.selectedSegmentIndex == 0)
                {
                    // action for the first button (Current or Default)
                }
                else if(segment.selectedSegmentIndex == 1)
                {
                    // action for the second button 
                }
                else if(segment.selectedSegmentIndex == 2)
                {
                    // action for the third button 
                } 
                else if(segment.selectedSegmentIndex == 3)
                {
                    // action for the fourth button 
                }
            }
            

            【讨论】:

            • 嗨,Alede,请将其中任何一个标记为您的解决方案。对于初学者来说,找出最简单和正确的解决方案将很有用。
            【解决方案8】:

            你可以这样做......

            UISegmentedControl *segmentControl = [[UISegmentedControl alloc]initWithItems:@[@"One",@"Two"]];
            
            [segmentControl setSegmentedControlStyle:UISegmentedControlStyleBar];
            segmentControl.frame = CGRectMake(10, 50, 300, 30);
            [segmentControl addTarget:self action:@selector(segmentedControlValueDidChange:) forControlEvents:UIControlEventValueChanged];
            [segmentControl setSelectedSegmentIndex:0];
            [scrollView addSubview:segmentControl];
            [segmentControl release];
            

            第 2 步:

            -(void)segmentedControlValueDidChange:(UISegmentedControl *)segment
            {
            switch (segment.selectedSegmentIndex) {
                case 0:{
                    //action for the first button (Current)
                    break;}
                case 1:{
                    //action for the first button (Current)
                    break;}
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2016-09-19
              • 2014-07-20
              • 2015-11-30
              • 1970-01-01
              • 2021-11-25
              • 2017-01-04
              • 1970-01-01
              相关资源
              最近更新 更多