选择/取消选择动态创建的UIButtons

时间:2016-01-12 11:32:39

标签: ios objective-c uibutton

我将解释场景: 我在for循环中动态创建三个UIButtons。默认条件是第一个按钮应该是边框。现在如果我们选择其他按钮,前一个按钮的边框应该去,现在边框应该出现在所选按钮上。

for (int btnsCount = 0 ; btnsCount <[DataList count]; btnsCount++) {
  self.graphSubDataButton = [[UIButton alloc] init];


    self.graphSubDataButton.frame = CGRectMake(buttonsOffset, 0, 120, 40);
    [self.graphSubDataButton setTitleColor:UIColorFromRGB(0x548DCD) forState:UIControlStateNormal];

    [self.graphSubDataButton.titleLabel setFont:[UIFont fontWithName:AVENIR_NEXT_MEDIUM size:13.0f]];

    self.graphSubDataButton.tag = btnsCount+1;
    [self.graphSubDataButton addTarget:self action:@selector(enableRespectiveButton2:) forControlEvents:UIControlEventTouchUpInside];
    buttonsOffset = buttonsOffset+30 + self.graphSubDataButton.frame.size.width ;

if (self.graphSubDataButton.tag==1)
    {

        [self.graphSubDataButton.layer setBorderWidth:1.2f];
        [self.graphSubDataButton.layer setBorderColor:[UIColorFromRGB(0x3070BA) CGColor]];
        [self.graphSubDataButton.layer setCornerRadius:8.0f];
    }
}   


-(void) enableRespectiveButton2:(UIButton *) sender
{
}   

4 个答案:

答案 0 :(得分:1)

我已经改变了你的代码结构以使其正常工作,如果你不理解某些东西,你可以发表评论。

NSInteger defaultSelectedTag = 1;
for (int btnsCount = 0 ; btnsCount <[DataList count]; btnsCount++) {
   UIButton *graphSubDataButton = [UIButton buttonWithType:UIButtonTypeCustom];
   graphSubDataButton.frame = CGRectMake(buttonsOffset, 0, 120, 40);
   [graphSubDataButton setTitleColor:UIColorFromRGB(0x548DCD) forState:UIControlStateNormal];
   [graphSubDataButton.titleLabel setFont:[UIFont fontWithName:AVENIR_NEXT_MEDIUM size:13.0f]];
   graphSubDataButton.tag = btnsCount+1;
   [graphSubDataButton addTarget:self action:@selector(enableRespectiveButton:) forControlEvents:UIControlEventTouchUpInside];
   buttonsOffset = buttonsOffset+30 + self.graphSubDataButton.frame.size.width ;
   //add your button somewhere
   //e.g.
   //[self.view addSubview:graphSubDataButton];
   if (graphSubDataButton.tag == defaultSelectedTag) {
       [self setBorderForButton:graphSubDataButton];
   }
}

- (void) setBorderForButton:(UIButton *)sender {
    [sender.layer setBorderWidth:1.2f];
    [sender.layer setBorderColor:[UIColorFromRGB(0x3070BA) CGColor]];
    [sender.layer setCornerRadius:8.0f];
}

- (void) enableRespectiveButton2:(UIButton *) sender {
    for(UIButton *buttons in [sender.superview subviews]) {
        if([buttons isKindOfClass:[UIButton class]]) {
            if(![buttons isEqual:sender]) {
                //add logic to, remove borders
                //buttons.layer.borderWidth = 0.0f;
            }
        }
    }
    [self setBorderForButton:sender];
}

答案 1 :(得分:1)

使用标记获取当前选定的按钮或更简单:迭代所有子视图并将边框设置为0以获取UIButtons

    for (UIView *subview in [uiv_ButtonsView subviews]) { 
    if([subview isKindOfClass:[UIButton class]]) {
        subview.layer  setBorderWidth:0.0f;
        }
     } 

然后使用:

    UIButton *button=(UIButton *)sender;
    [button.layer setBorderWidth:1.2f];
    [button.layer setBorderColor:[UIColorFromRGB(0x3070BA) CGColor]];
    [button.layer setCornerRadius:8.0f];

答案 2 :(得分:1)

创建动态按钮,如:

int buttonsOffset = 50;
for (int btnsCount = 0 ; btnsCount <3; btnsCount++)
{
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.backgroundColor = [UIColor blueColor];
    btn.frame = CGRectMake(buttonsOffset, 100, 120, 40);
    [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [btn.titleLabel setFont:[UIFont systemFontOfSize:13.0f]];
    btn.tag = btnsCount+1;
    [btn addTarget:self action:@selector(enableRespectiveButton2:) forControlEvents:UIControlEventTouchUpInside];
    buttonsOffset = buttonsOffset+30 + btn.frame.size.width;

    if (btn.tag==1)
    {
        [btn.layer setBorderWidth:1.2f];
        [btn.layer setBorderColor:[UIColor greenColor].CGColor];
        [btn.layer setCornerRadius:8.0f];
        self.graphSubDataButton = btn;
    }
    [self.view addSubview:btn];
}

按钮的点击事件如下

- (void)enableRespectiveButton2:(UIButton *)sender
{
    sender.selected = TRUE;
    [sender.layer setBorderWidth:1.2f];
    [sender.layer setBorderColor:[UIColor greenColor].CGColor];
    [sender.layer setCornerRadius:8.0f];

    self.graphSubDataButton.selected = FALSE;
    [self.graphSubDataButton.layer setBorderWidth:0.0f];
    [self.graphSubDataButton.layer setBorderColor:[UIColor clearColor].CGColor];
    [self.graphSubDataButton.layer setCornerRadius:0.0f];
    self.graphSubDataButton = sender;
}

答案 3 :(得分:1)

使用for循环创建动态按钮,如下所示。

for(int i = 0 ;i <3; i++) {
    UIButton * btn = [UIButton buttonWithType:UIButtonTypeCustom];
    NSString * title = [NSString stringWithFormat:@"Button %d",i];
    [btn setTitle:title forState:UIControlStateNormal];
    [btn setBackgroundImage:[UIImage imageNamed:@"BorderImg"] forState:UIControlStateSelected];
    [btn setBackgroundImage:[UIImage imageNamed:@"UnBordered"] forState:UIControlStateNormal];
    if(i == 0) [btn setSelected:YES];
    else [btn setSelected:NO];
    [btn setTag:i];
    [btn addTarget:self action:@selector(btnTapped:) forControlEvents:UIControlEventTouchUpInside];
}

有2张图片

  1. 突出显示的边框(BorderImg)
  2. 普通边框(UnBordered)
  3. for循环

    中创建时,将这些图像设置为按钮
    - (void)btnTapped:(UIButton *) btn {
    if(! btn.isSelected) {
        [btn setSelected:YES];
    }
    

    在内部按钮选择器方法中,基于sender选择状态,更新按钮选择状态。 (在侧选择器方法中,btnTapped将其他按钮选择状态设置为false