2011-01-11 2 views
1

Я пытаюсь имитировать функцию перетаскивания iPhone Springboard для игры с черепицей, и в настоящее время я использую MatrixCells для создания UIButtons в Просмотрите инициализацию и добавьте их в представление. MatrixCells имеют тег order, который также используется для собственной кнопки ([button setTag:[cell order]];).Использование layoutsubviews() корректно работает при циклическом перемещении по UIButtons, но не при циклическом перемещении при извлечении их по тегу

При использовании `layoutSubviews 'для циклического перехода через UIButtons в представлении, чтобы упорядочить их в сетке, он отлично работает. Появится сетка, и моя функция перетаскивания позволяет мне свободно перетаскивать кнопки, где я буду.

- (void)layoutSubviews {

int row = 0; 
int col = 0; 
for (UIButton *button in [self subviews]) { 
    [button setFrame:CGRectMake(col * 80 + 5, row * 80 + 25, 70, 70)]; 

    if (col < 3) { 
     col++; 
    } 
    else { 
     row++; 
     col = 0; 
    } 
} 

}

Однако, езда на велосипеде через subviews не работает при изменении порядка ячеек, так как я уверен, что я не должен возиться там вообще. Итак, я хотел пройти через мой MatrixCells и использовать их order, чтобы получить соответствующее представление, а затем изменить frame. Однако макет перепутался с кнопкой 0, и я больше не могу использовать их в качестве кнопок.

- (void)layoutSubviews {

int row = 0; 
int col = 0; 
for (MatrixCell *cell in currentOrder) { 
    UIView *view = [self viewWithTag:[cell order]]; 
    [view setFrame:CGRectMake(col * 80 + 5, row * 80 + 25, 70, 70)]; 
    if (col < 3) { 
     col++; 
    } 
    else { 
     row++; 
     col = 0; 
    } 
} 

}

Вот фотография с результатами: http://i52.tinypic.com/2q903lk.png

viewWithTag казалось наиболее элегантное решение для этого. Поэтому я в недоумении. Любая идея, почему эти реализации не делают то же самое?

ответ

1

[self viewWithTag:0] возвращает self сначала, а не ожидаемый (UIButton *), так как я не изменил вид tag вида при инициализации. По-видимому, при инициализации по умолчанию используется значение 0. layoutsubviews затем приступил к изменению frame от self, испортив макет и функциональность. Я решил эту дилемму, изменив тег представления на 999 при инициализации.

2

Мне кажется, что у вас есть фон UIImage, чтобы обеспечить этот серый градиентный фон. Это также выглядит как ваша кнопка 0 может иметь [cell order] 0. Я собираюсь предположить, что вы никогда не изменили тег фона UIImage, который, таким образом, по умолчанию 0.

При вызове [self viewWithTag] для сначала UIButton (с надписью 0), он найдет первое подвью с тегом 0 - фоновое изображение, а не UIButton, которое вы ожидали, - и переместите это. Это, я подозреваю. почему все остальные кнопки выстраиваются в очередь, почему фон перемещается странно, и почему ваша кнопка 0 не видна.

+0

Не совсем правильно, но это привело меня на правильный путь. Я просто установил 'UIColor' для фона, и кнопки просто имеют' setImage'. Однако '[self viewWithTag: 0]' возвратил 'self', конечно, полностью испортил свой фрейм, забыв о кнопке 0 и не разрешив мне доступ к другим кнопкам (так как рамка не дошла так далеко). Но я решил, так спасибо! Какой протокол сейчас, я считаю этот ответ правильным? Или я должен ответить на свой вопрос? – SpacyRicochet

+0

Ах, моя психическая отладка не удалась (но только просто!). В этом случае я, вероятно, напишу свой собственный ответ и соглашусь с этим. Но upvote никогда не сходит с ума;) –

+0

Увы, я все еще скромный студент, даже не имеющий достаточной репутации для голосования. Но когда это станет возможным, я обязательно сделаю это :) – SpacyRicochet

Смежные вопросы