iPad - нет взаимодействия с пользователем при просмотре анимированных на экране - PullRequest
0 голосов
/ 08 декабря 2010

Хорошо, это вопрос новичка, поэтому я прошу прощения заранее. У меня есть UIView, который я выложил в Интерфейсном Разработчике вне экрана. Когда пользователь нажимает кнопку, я хотел бы анимировать это представление на экране. Это работает, но я не могу взаимодействовать ни с какими кнопками в UIView. Я читал, что при анимации перемещается только вид, и что фактические объекты сохраняют свои позиции, поэтому я попытался установить положение слоев UIViews, но это заставляет мое меню UIView отображать дополнительные 81 пиксель слева. Когда это происходит, я могу взаимодействовать с кнопками, но мне нужно, чтобы он был на одном уровне с правой частью экрана. Вот мой код в IBAction на кнопке openMenu:

 CABasicAnimation *moveView = [CABasicAnimation animationWithKeyPath:@"position"];
 moveView.delegate = self;
 moveView.duration=0.5; 

 // If the menu is displayed, close it!
 CGPoint currentPosView = [[entirePage layer] position];
 CGPoint destView;

 [moveView setFromValue:[NSValue valueWithCGPoint:currentPosView]];

 if (menuDisplayed) {
  // Move right to our destination
  destView.x = currentPosView.x;
  destView.y = currentPosView.y + 81;

  [moveView setToValue:[NSValue valueWithCGPoint:destView]];

 // Otherwise, open it
 } else {
  // Move left to our destination
  destView.x = currentPosView.x;
  destView.y = currentPosView.y - 81;

  [moveView setToValue:[NSValue valueWithCGPoint:destView]];
 }

 // Animate the view
 [[entirePage layer] addAnimation:moveView forKey:@"move"];

 // Set the final position of our layer
 [[entirePage layer] setPosition:destView];

 menuDisplayed = !menuDisplayed;

А затем в методе animationDidStop:

 CGPoint currentPosMenu = [[menuBar layer] position];

 if (menuDisplayed) {
  currentPosMenu.x -= 81;
 } else {
  currentPosMenu.x += 81;
 }

 [[menuBar layer] setPosition:currentPosMenu]; 

Помощь ???

Ответы [ 2 ]

0 голосов
/ 09 декабря 2010

Забудьте об анимации на данный момент; Вы должны переместить ваше представление, установив его свойство frame.

например:.

CGRect menuFrame = entirePage.frame;
if (menuDisplayed)
{
    menuFrame.origin.x += 81;
}
else
{
    menuFrame.origin.x -= 81;
}
entirePage.frame = menuFrame;

// Do your animation here, after the view has been moved

Не беспокойтесь об анимации, пока не убедитесь, что ваш вид находится в правильном месте. Убедившись, что этот код работает правильно, выполните анимацию после и установите свойство frame.

Обратите внимание, что вам, вероятно, вообще не нужно использовать API CoreAnimation, если вы не делаете что-то сложное. UIKit может делать анимацию самостоятельно. Например:

[UIView beginAnimations:@"MyAnimation" context:NULL];
myFirstView.frame = ...;
myOtherView.frame = ...;
[UIView commitAnimations];
0 голосов
/ 09 декабря 2010

Вам не нужно связываться со слоями. Вы могли бы, вероятно, достичь желаемого эффекта, разместив представления в Интерфейсном Разработчике в положениях, в которых они будут находиться после их анимации. Другими словами, сначала раскладывайте вещи в их окончательных / правильных положениях. Не делай ничего прикольного в IB.

В вашем коде после запуска приложения или в -viewDidAppear: метод, если вы используете UIViewController, вы можете сместить представления на некоторое количество, а затем восстановить их в исходное положение в блоке анимации:

myView.transform = CGAffineTransformMakeTranslation(0,81);

[UIView beginAnimations:@"slideUp" context:nil];
myView.transform = CGAffineTransformIdentity;
[UIView commitAnimations];

Что касается отсутствия взаимодействия пользователя с вашими представлениями, это может быть несколько вещей. Если все ваши представления являются подпредставлениями чего-то наподобие UIImageView, для UIImageView для userInteractionEnabled установлено значение NO по умолчанию (по крайней мере, если вы создаете его в коде - я не уверен вручную, какие настройки IB по умолчанию используются для представления изображений). Это также может означать, что суперпредставление ваших представлений на самом деле слишком мало и его кадр не содержит подпредставлений. (Если бы для суперпредставления было включено отсечение, вы бы даже не смогли увидеть подпредставления, которые имеют эту конкретную проблему.)

EDIT:

Я читаю вещи более внимательно и вижу, что вы хотите, чтобы вещи двигались в ответ на нажатие кнопки, поэтому, другими словами, представления должны быть скрыты с самого начала. В этом случае вы все равно могли бы выложить все в IB в их окончательном положении, но просто установить их как скрытые в IB. Когда вы нажимаете кнопку, установите видения видимыми (скрытые = НЕТ) перед их переводом. Это должно позволить им быть размещенными в их окончательном / правильном месте в IB, следя за тем, чтобы они располагались на надлежащих суперпредставлениях и т. Д., В то же время получая необходимый эффект анимации.

...