如何在iOS中的多行和列中创建Button?

时间:2015-11-28 13:16:39

标签: ios

过去3天我被困在这个位置。我无法找到解决这个问题的方法。我有一个数组中的多个数据。根据数据,我必须在我的应用程序中创建一个路由。我在for循环中创建按钮。但它一排一排。但我的要求是,在每一行中都应该是相反的方向。

这是我的要求。

enter image description here

这种紫色是我的按钮,红色是路径。

int x_pos = 40;
int y_pos = 50;
for (int i = 0; i < 5 ; i ++)
{
    UIButton *courseBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    courseBtn.frame = CGRectMake(x_pos, y_pos, 40, 40);
    courseBtn.backgroundColor = [UIColor purpleColor];
    [self.courseMapScroll addSubview:courseBtn];

    courseBtn.layer.cornerRadius = courseBtn.frame.size.height/2;
    courseBtn.layer.masksToBounds = YES;

    NSLog(@"x_pos == %d",x_pos);
    x_pos = x_pos + (SCREEN_WIDTH - 120);

    if (x_pos > 320)
    {
        x_pos = 40;
        y_pos = y_pos + 100;
    }
    [self.courseMapScroll setContentSize:CGSizeMake(SCREEN_WIDTH, y_pos + 70)];
}

我的代码就像这样

请有人帮助我。请

非常感谢

2 个答案:

答案 0 :(得分:1)

这就是你要求它的确切方式(使用你在聊天中请求的绿线)。有乐趣调整价值观:))

int numButtons = 6;
int yInterval = 100;
int leftX = 50;
int rightX = self.view.frame.size.width - leftX*2;
int lineWidth = 6;
int buttonRadius = 40;
int topMargin = 60;   

for (float i = 1; i < numButtons+1 ; i++) {
    float yPos = (ceil(i/2)-1)*yInterval+topMargin;
    BOOL isRightDirection = (fmod(ceil(i/2),2) == 1);
    BOOL isEven = (fmod(i,2) == 0);
    BOOL isOnLeft = (isRightDirection != isEven);
    float xPos = (isOnLeft) ? leftX : rightX;

    if (i != numButtons) {
        double nextUnlockedDecimal = (double)nextPercentUnlocked/100;
        UIView *redLine = [[UIView alloc] initWithFrame:CGRectZero];
        redLine.backgroundColor = [UIColor redColor];
        UIView *greenLine = [[UIView alloc] initWithFrame:CGRectZero];
        greenLine.backgroundColor = [UIColor greenColor];
        if (isEven) {
            //Vertical
            int xToUse = (isRightDirection) ? rightX : leftX;
            redLine.frame = CGRectMake(xToUse + buttonRadius/2 - lineWidth/2, yPos + buttonRadius/2, lineWidth, yInterval);
            if (i == latestUnlocked) {
                greenLine.frame = CGRectMake(xToUse + buttonRadius/2 - lineWidth/2, yPos + buttonRadius/2, lineWidth, nextUnlockedDecimal * yInterval);
            } else if (i < latestUnlocked) {
                greenLine.frame = redLine.frame;
            }
        } else {
            //Horizontal
            redLine.frame = CGRectMake(leftX + buttonRadius/2, yPos + buttonRadius/2 - lineWidth/2, rightX-leftX, lineWidth);
            if (i == latestUnlocked) {
                double greenLineX = (isRightDirection) ? leftX + buttonRadius/2 : rightX + buttonRadius/2 - nextUnlockedDecimal * (rightX-leftX);
                greenLine.frame = CGRectMake(greenLineX, yPos + buttonRadius/2 - lineWidth/2, nextUnlockedDecimal * (rightX-leftX), lineWidth);
            } else if (i < latestUnlocked) {
                greenLine.frame = redLine.frame;
            }
        }

        greenLine.layer.cornerRadius = 2.5;
        [self.view addSubview:redLine];
        [self.view addSubview:greenLine];
    }

    UIButton *courseBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    courseBtn.backgroundColor = [UIColor purpleColor];
    courseBtn.layer.cornerRadius = buttonRadius/2;
    courseBtn.layer.masksToBounds = YES;
    courseBtn.frame = CGRectMake(xPos, yPos, 40, 40);
    NSString *numStr = [NSString stringWithFormat:@"%i",(int)i];
    [courseBtn setTitle:numStr forState:UIControlStateNormal];

    [self.courseMapScroll setContentSize:CGSizeMake(SCREEN_WIDTH, yPos + 70)];
    [self.courseMapScroll addSubview:courseBtn];
}

答案 1 :(得分:0)

我不知道为什么我真的这样做......这应该有用,我还没有测试过它......我建议你使用全局可变数组(courseButtons)存储按钮,这样你就可以检查目标对阵列的索引,并知道点击了哪一个。

CGFloat buttonHorizontalMargin=40;
CGFloat buttonVerticalMargin=50;
CGFloat buttonSize=40;

CGFloat x_pos = buttonHorizontalMargin;
CGFloat y_pos = buttonVerticalMargin;

[self.courseMapScroll setContentSize:CGSizeMake(self.courseMapScroll.bounds.size.width, y_pos + buttonSize+buttonVerticalMargin*0.5)];

for (NSInteger i = 0; i < [_buttonPoints count] ; i ++)
{
    UIButton *courseBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [courseBtn setTitle:[NSString stringWithFormat:@"%ld",(long)i] forState:UIControlStateNormal];
    [courseBtn setTranslatesAutoresizingMaskIntoConstraints:YES];
    [courseBtn setAutoresizesSubviews:(((i+1)%2==0&&(i+1)%4!=0)||(i+1)%3==0)?UIViewAutoresizingFlexibleLeftMargin:UIViewAutoresizingRightMargin];
    [courseBtn addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
    courseBtn.frame = CGRectMake(x_pos, y_pos, buttonSize, buttonSize);
    courseBtn.backgroundColor = [UIColor purpleColor];
    [self.courseButtons addObject:courseBtn];
    [self.courseMapScroll addSubview:courseBtn];

    courseBtn.layer.cornerRadius = courseBtn.frame.size.height*0.5;
    courseBtn.layer.masksToBounds = YES;

    NSLog(@"x_pos == %d",x_pos);
    if((i+1)%4){
        x_pos = buttonHorizontalMargin;
    }else if((i+1)%3||(i+1)%2){
        x_pos = self.courseMapScroll.bounds.size.width-buttonHorizontalMargin-buttonSize;
    }else{
        x_pos = buttonHorizontalMargin;
    }

    if (i>0 && i%2==0){
        y_pos = y_pos + buttonSize+buttonVerticalMargin;
        [self.courseMapScroll setContentSize:CGSizeMake(self.courseMapScroll.bounds.size.width, y_pos + buttonSize+buttonVerticalMargin*0.5)];
    }
}