Подкласс UISlider вызывает зависание пользовательского интерфейса только в одном UIView универсального приложения - PullRequest
0 голосов
/ 14 августа 2011

Я работал над внешним интерфейсом универсального приложения для 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, и у него возникла та же проблема, не будучи подключенным к чему-либо. Это указывает на проблему с контроллером представления или даже на какую-то ошибку.

1 Ответ

0 голосов
/ 15 августа 2011

Хотя у меня нет окончательной причины проблемы, мне удалось это исправить.По сути, я создал новый UIView для портретной ориентации iPhone в Interface Builder, перестроил интерфейс и подключил его вместо хитрого, и проблема исчезла.Я не знаю, могло ли у меня быть искаженное представление в XIB, это единственный ответ, который я могу предложить.

...