Динамические кнопки UIB с вертикальным интервалом в UIScrollView - PullRequest
0 голосов
/ 11 мая 2011

Мне нужно разместить кнопки UIB на UIScrollView. Код у меня работает, однако в зависимости от количества dataItems у меня интервал даже не равен.

Фрагмент в вопросе

CGRectMake(10, ((120 / (count + 1)) * (i + 1) * 3) ,300,50)

Конкретно

((120 / (count + 1)) * (i + 1) * 3)

Рабочий код

int count = [dataItems count];  /*  not a specific value, can grow  */
for (int i = 0; i < count; i++) {
    UIButton* aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [aButton setTag:i];
    [aButton setFrame: CGRectMake(10,((120 / (count + 1)) * (i + 1) * 3) ,300,50) ];
    [aButton setTitle:[[dataItems objectAtIndex:i] objectForKey:@"Feed"] forState:UIControlStateNormal];
    [aButton addTarget:self action:@selector(viewCategories:) forControlEvents:UIControlEventTouchUpInside];
    [scroller addSubview:aButton];
}

Скриншот

Пример справа должен выглядеть как пример слева относительно расстояния. UIButtons сидит на UIScrollView, поэтому UIScrollView contentSize также должен расти, если их больше dataItems, чтобы кнопки могли прокручиваться за пределы экрана, если, скажем, 30 + dataItems.

enter image description here

Ответы [ 3 ]

4 голосов
/ 11 мая 2011

звучит так, как будто вам нужен заданный размер и отступ ...

int count = [dataItems count];
CGFloat staticX = 10; // Static X for all buttons.
CGFloat staticWidth = 300; // Static Width for all Buttons.
CGFloat staticHeight = 50; // Static Height for all buttons.

CGFloat staticPadding = 10; // Padding to add between each button.

for (int i = 0; i < count; i++) {
    UIButton* aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [aButton setTag:i];
    //Calculate with the Static values.
    //I added one set of padding for the top. then multiplied padding plus height for the count.
    // 10 + 0 for the first
    // 10 + 60 for the second.
    // 10 + 120 for the third. and so on.
    [aButton setFrame: CGRectMake(10,(staticPadding + (i * (staticHeight + staticPadding)) ,staticWidth,staticHeight) ];
    [aButton setTitle:[[dataItems objectAtIndex:i] objectForKey:@"Feed"] forState:UIControlStateNormal];
    [aButton addTarget:self action:@selector(viewCategories:) forControlEvents:UIControlEventTouchUpInside];
    [scroller addSubview:aButton];
}

однако, если вы пытаетесь получить кнопки для такого рода поведения. Я склонен согласиться с остальным. Вы можете сделать собственную ячейку с кнопкой в ​​ней.

Затем вы можете загрузить эту ячейку кнопки, когда таблица запросит кнопку.

И у вас есть привязка таблицы к вашему [количеству элементов данных] для общего количества элементов.

тогда ваш единственный расчет - установить высоту ячейки, когда вы изначально устанавливаете счетчик dataItems. стараясь не делать их слишком короткими. и стол будет обрабатывать все остальное.

1 голос
/ 11 мая 2011

Я согласен с Гурпартарпом, но если бы у вас на этом не получилось, я бы сделал это немного по-другому. Даже если вы понимаете математику в этом выражении setFrame сейчас, поймете ли вы или кто-то еще это позже. Я уверен, что не смотрю на это быстро. Почему бы не сделать что-то вроде:

CGRect frm = CGRectMake(10,10,300,50);
for (int i = 0; i < count; i++) {
  UIButton* aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
  [aButton setFrame: frm];
  frm.origin.y = frm.origin.y + aButton.frame.size.height + 10;
  etc, etc
0 голосов
/ 11 мая 2011

Вы должны действительно использовать вместо этого UITableView. Он делает вид прокрутки, расположение ячеек и т. Д. Сам по себе. Вы просто указываете содержимое ячейки.

...