Дубликаты слоев, нарисованных с помощью UIImageView и CGAffineTransform

#iphone #animation #uiview #transform #cgaffinetransform

#iPhone #Анимация #uiview #преобразование #cgaffinetransform

Вопрос:

У меня возникла проблема с применением преобразования к слою UIImageView. Используя приведенный ниже код, я пытаюсь повернуть эту иглу, но у меня получаются дублирующиеся копии. Я проверил, что нет другого места, где добавлено изображение иглы, и при комментировании addSubview ни одно из них не отображается, так что оно определенно рисуется дважды.

Стрелка слева находится в том положении, с которого следует начинать просмотр изображения, -20 . Стрелка справа работает в том аспекте, что она поворачивается, и отображает правильное значение для needleValue . Что я делаю не так, чтобы получить дублирующиеся рисунки?

текст alt

 - (UIImageView *)needle {
 if (_needle == nil) {
  UIImage *image = [UIImage imageNamed:@"needle.png"];
  self.needle = [[[UIImageView alloc] initWithImage:image] autorelease];
  [_needle sizeToFit];
  [_needle setFrame:CGRectMake(floor((self.width - _needle.width)/2),
          self.height - _needle.height   68, // this - offset comes from the lowering of the numbers on the meter
          _needle.width, _needle.height)];
  _needle.contentMode = UIViewContentModeCenter;
  _needle.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin;
  _needle.autoresizesSubviews = YES;

  // CALayer's transform property is a CATransform3D.
  // rotate around a vector (x, y, z) = (0, 0, 1) where positive Z points 
  // out of the device's screen.
  _needle.layer.anchorPoint = CGPointMake(0.05,1);

  [self addSubview:_needle];
 }
 return _needle;
}



- (void)updateNeedle {
 [UIView beginAnimations:nil context:NULL]; // arguments are optional
 [UIView setAnimationDuration:VU_METER_FREQUENCY];
 CGFloat radAngle = [self radianAngleForValue:needleValue];
 self.needle.transform = CGAffineTransformMakeRotation(radAngle);
 [UIView commitAnimations];
}
  

Ответ №1:

Попробуйте установить точку останова в строке [self addSubview:...] и посмотрите, вызывалась ли она дважды. _needle Переменной может быть присвоено значение nil где-то еще?

Комментарии:

1. Я чувствую себя идиотом, что не попробовал это раньше… Я просто использовал проверку кода.