Я работал над внешним интерфейсом универсального приложения для iOS, настраивая отдельные контроллеры представлений iPhone и iPad в качестве подклассов контроллера представления без XIB (как описано в http://www.kotancode.com/2011/04/05/ios-universal-apps/). Каждый контроллер подклассического представления содержит специфичный для устройства XIB, где каждый XIB содержит портретные и альбомные UIViews, которые переключаются при изменении ориентации (для этого я следовал http://aseriesoftubes.com/articles/ipad-development-101-orientation/). Элементы управления, общие для всех четырех UIViews, синхронизируются с методом IBAction, связанным через IBOutletCollections.
Только сегодня я создал подкласс UISlider для своего собственного дизайна слайдера, который, кажется, работает нормально, за исключением одной большой проблемы: при тестировании с iPhone в симуляторе, начиная с портретной ориентации, слайдер работает нормально; при переключении на ландшафт это тоже нормально; однако, когда я переключаюсь обратно в портретный режим, слайдер работает до двух операций, а затем останавливается, беря с собой некоторые другие элементы управления видом; еще страннее, если я вернусь в ландшафт, слайдер работает нормально! Это происходит только с симулятором iPhone, а не iPad.
Я попытался включить и выключить параметр IB «Непрерывный» и пробовал подключения «Touch Up Inside» и «Value Changed» из отправленных событий моего ползунка без изменений (как это будет для регулятора громкости I понадобится «Значение изменено» для работы). Код реализации моего слайдера таков:
@implementation VolumeSlider
- (id)initWithCoder:(NSCoder *)decoder
{
if((self = [super initWithCoder: decoder])) // Double paretheses to silence warning
{
// Instantiate slider images
UIImage *thumbImage = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"volume thumb" ofType: @"png"]];
UIImage *trackImage = [[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"volume track" ofType: @"png"]] stretchableImageWithLeftCapWidth: 20 topCapHeight: 0];
// Set control elements with images
[self setThumbImage: thumbImage forState: UIControlStateNormal];
[self setMinimumTrackImage: trackImage forState: UIControlStateNormal];
[self setMaximumTrackImage: trackImage forState: UIControlStateNormal];
}
return self;
}
- (void)dealloc
{
[super dealloc];
}
@end
Два метода действия, которые запускают ползунки:
- (IBAction)volumeChange:(id)sender
{
NSLog(@"VOLUME slider changing");
// VOLUME slider action
}
- (IBAction)volumeChangeFinish:(id)sender
{
NSLog(@"VOLUME change finished");
VolumeSlider *incomingVolume = sender;
for(VolumeSlider *volumeSlider in self.volumeSliders)
{
volumeSlider.value = incomingVolume.value;
}
}
(volumeChange будет использовать значение ползунка для изменения громкости в режиме реального времени, volumeChangeFinished обновит другие ползунки в представлении при касании изнутри.)
Это меня озадачило - похоже на проблему с памятью, но я не могу понять, где именно. У кого-нибудь есть идеи, что может быть причиной этого?
(Mac OS 10.6.8, Xcode 4.0.2, сборка для iOS 4.3)
ОБНОВЛЕНИЕ ---
Я попытался создать новый стандартный UISlider в представлении iPhone, и у него возникла та же проблема, не будучи подключенным к чему-либо. Это указывает на проблему с контроллером представления или даже на какую-то ошибку.