2016-03-06 7 views
1

Я хочу создать вертикальный UISlider и точно поместить его в существующий вид контейнера, размер которого помещен в файл .xib, используя autoLayout. Но я просто не могу заставить его работать, и у меня гугли мои пальцы кровавые.Установите вертикальный UISlider в существующий вид контейнера?

Самый близкий, который я получил, создает слайдер, который слишком длинный и выходит за пределы экрана.

Я помещаю код в неположенное место?

Я помещаю свой код в "layOutSubviews" некоторых точек интереса:

документов 1.Per компании Apple, вид в «кадр» не является действительным после преобразования и не должен быть установлен.

2. Рамка ползунка установлена ​​в размеры будущего родителя до преобразование (с заменой x и y).

3. Преобразованный вид, как представляется, сохраняет свои границы в кадре координат предварительного преобразования. т. е. после 90-градусного преобразования ширина и высота границ преобразованного представления, по-видимому, меняются местами.

Этот код не работает. Ползунок выглядит правильно, за исключением того, что он распространяется в нижней части экрана. Ограничения ползунка и даже фрейм (который Apple говорит недействительно), похоже, соответствуют границам и рамке представления контейнера. Ползунок даже не остается в пределах своих границ.

[super layoutSubviews]; 

CGRect trigLevelSliderFrame=self.trigLevelSliderContainer.bounds; 
trigLevelSliderFrame.size.height=self.trigLevelSliderContainer.bounds.size.width; 
trigLevelSliderFrame.size.width=self.trigLevelSliderContainer.bounds.size.height; 

UISlider *mySlider=[[UISlider alloc] initWithFrame:trigLevelSliderFrame]; 
self.trigSlider=mySlider; 
[mySlider release]; 

self.trigSlider.transform=CGAffineTransformMakeRotation(-M_PI_2); 
CGPoint center=CGPointMake(self.trigLevelSliderContainer.bounds.size.width/2,self.trigLevelSliderContainer.bounds.size.height/2); 
self.trigSlider.center=center; 
[self.trigLevelSliderContainer addSubview:self.trigSlider]; 

ответ

1

С этим кодом не нужно устанавливать и поворачивать ползунок. Проблема в том, что код должен быть помещен в метод layoutSubviews родительского представления ползунка; вместо этого я получил его в «layoutSubviews» родительского представления родительского представления слайдера. Когда мой исходный код выполнил родительское представление ползунка, еще не было выложено и еще не было правильных размеров.

Во время просмотра «layoutSubviews» представления, еще не были выложены подсмотры, и поэтому их границы еще не действительны. Мне нужно было подождать, пока позже в процессе компоновки, чтобы получить границы родительского представления и преобразовать ползунок в соответствие.

В конце я добавил код для добавления слайдера и преобразования слайдера в «viewDidAppear» контроллера верхнего уровня. Это был тот же код, что и в исходном вопросе - только в другом месте.

+0

Я не понимаю этого решения проблемы, но ваш ответ дал мне надежду найти мое собственное решение, которое я сделал. Если бы вы могли добавить к вашему ответу соответствующий код, это было бы здорово! Это определенно оказалось для меня проблемой «времени» ... Я просто переключил проблемный код на функцию 'viewDidAppear', которая загружалась позже и правильно для разных размеров экрана. – PlateReverb

+0

Я рад, что помог кому-то. Моя память об этом расплывчата; но, насколько я помню, я помещал ползунок в содержащий вид, который был размером и формой конечного слайдера. Я сделал это, чтобы использовать автоматическую компоновку. Затем я программно поместил ползунок в представление контейнера, а затем преобразовал его в соответствии с размерами вида контейнера. Моя ошибка заключалась в добавлении ползунка к виду контейнера и вращении его в неправильном месте - до того, как был выложен контейнерный вид. Я попытаюсь изменить свой ответ, чтобы быть более ясным. – PaulB

+0

Как вы знаете, какой порядок между планируемым контейнером и вашим кодом вращает ползунок? Порядок работы с автозапуском/IB и функциями 'viewDidLoad' является для меня полной тайной (до моей проблемы, я предположил, что IB/autolayout всегда будет первым.Вот ссылка на мою конкретную проблему (и «хакерское» решение), если вы заинтересованы: http://stackoverflow.com/questions/41734256/uislider-handle-changes-width-on-different-size-ipads – PlateReverb

Смежные вопросы