Как новичок в программировании iOS, я борюсь с игрой в слова для iPhone .
Структура приложения: scrollView -> contentView -> imageView -> image 1000 x 1000
(здесь полноэкранный режим):
Я думаю, что наконец-то понял, как использовать UIScrollView
с включенным автоматическим макетом в Xcode 5.1:
Я просто указываю достаточно ограничений (размеры 1000 x 1000, а также 0 для родителя) для contentView
, и это определяет _scrollView.contentSize
(мне не нужно задавать его явно) — после этого игровое поле отлично прокручивается и масштабируется.
Однако у меня возникли проблемы с моими перетаскиваемыми плитками с буквами, реализованными в плитке .м.
Я использую touchesBegan, touchesMoved, touchesEnded, touchesCancelled
, а не распознаватели жестов (как часто предлагают пользователи StackOverflow), потому что я отображаю более крупную буквенную плитку с тенью (bigImage
) на touchesBegan
.
Мое перетаскивание реализовано следующим образом:
- В
touchesBegan
я удаляю плитку изcontentView
(и добавляю ее в основной вид приложения) и отображаюbigImage
с тенью. - В
touchesMoved
я перемещаю плитку - В
touchesEnded
илиtouchesCancelled
я снова отображаюsmallImage
с тенью и - добавляю плитку кcontentView
или оставляю ее в основном виде (если плитка находится внизу приложения).
Моя проблема:
В основном это работает, но иногда (часто) я вижу, что вызывается только touchesBegan
, а остальные touchesXXXX
методы никогда не вызываются:
2014-03-22 20:20:20.244 ScrollContent[8075:60b] -[Tile touchesBegan:withEvent:]: Tile J 10 {367.15002, 350.98877} {57.599998, 57.599998}
Вместо этого scrollView
прокручивается пальцем под большой плиткой.
Это приводит к тому, что на экране моего приложения появляется много больших плиток с тенями, в то время как вид прокрутки перетаскивается под ними:
Пожалуйста, как это исправить?
Я точно знаю, что моя структура приложения (с пользовательскими UIView
s, перетащенными в / из UIScrollView
) возможна - глядя на популярные игры в слова.
Я использую tile.exclusiveTouch = YES
и пользовательский метод hitTest для contentView - но это не помогает:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView* result = [super hitTest:point withEvent:event];
return result == self ? nil : result;
}
ОБНОВЛЕНИЕ 1:
Я попытался добавить следующий код в handleTileTouched
:
_contentView.userInteractionEnabled = NO;
_scrollView.userInteractionEnabled = NO;
_scrollView.scrollEnabled = NO;
а затем снова установите значение YES
в handleTileReleased
ViewController. m - но это не помогает, а также больше похоже на взлом.
ОБНОВЛЕНИЕ 2:
Прочитав, вероятно, все, что связано с UIScrollView
, hitTest:withEvent:
и pointInside:withEvent:
- в Интернете (например, Взлом цепочки ответчиков и книгу Мэтта Нойбурга по Programming iOS), StackOverflow и Safari, мне кажется, что решением было бы реализовать метод hitTest:withEvent:
для основного представления моего приложения:
Если объект Tile
поражен, он должен быть возвращен. В противном случае следует вернуть scrollView
.
К сожалению, это не работает - я, вероятно, упустил что-то незначительное.
И я уверен, что хорошее решение существует — изучая популярные словесные игры для iOS. Например, перетаскивание и размещение плиток с буквами работает очень гладко в приложении Zynga Words with Friends , и на снимках экрана ниже вы можете см. их, вероятно, используя UIScrollView
(полосы прокрутки видны в углу) и отображая тень плитки (вероятно, в методе touchesBegan
):
ОБНОВЛЕНИЕ 3:
Я создал новый проект для тестирования распознавателя жестов, предложенного TomSwift. и это показывает мою проблему с распознавателями жестов: размер плитки меняется слишком поздно - это происходит, когда пользователь начинает перемещать плитку, а не в тот момент, когда он ее касается:
:-)
У меня была такая же фаза с карточной игрой (мобильной и настольной), и теперь (с 4 лет) она просто работает: facebook.com/appcenter/video-preferans Мне просто нужно ответить на критическую массу глупых вопросов, и тогда я в порядке. Пожалуйста, проявите терпение к моему новичку в iOS. - person Alexander Farber   schedule 25.03.2014