2010-08-15 6 views
1

Я пытаюсь сделать представление временной шкалы, которое показывает события как UIButtons, которые можно нажать для получения дополнительной информации.Можно ли настроить UIScrollView для масштабирования по горизонтали, но не по вертикали? (как)

В идеале я хочу выложить кнопки на UIScrollView и позволить им растягиваться/сжиматься горизонтально, но не вертикально.

То, что я пытаюсь выполнить, в основном эквивалентно использованию жесты щепотка для изменения размера представления содержимого и использования вида прокрутки для перемещения сбоку - не могли бы вы указать мне в правильном направлении или предложить, как вы могли бы выполнить что-то подобное?

Моя первая мысль - это UIScrollView для масштабирования подвью UIView, а подвью UIView содержит другое подзапрос, которое не изменяет размер по вертикали, но только по горизонтали, когда границы изменяются, и отключает вертикальную прокрутку. Возможно, я мог бы пропустить один из этих подпрограмм UIView и сделать только один. Мне просто кажется, что я пытаюсь взломать это вместе, как HTML-страницу или что-то со всеми этими контейнерами.

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

ответ

-1

Предполагая, что на самом деле вы не хотите растягивать/сжимать текст кнопки, самым простым способом является изменение размера всех кнопок. Я знаю, это боль.

+0

Это действительно лучший способ пойти. Это было не так сложно, как я и ожидал, сложная часть заключалась в том, как добавлять на экран и удалять экраны, когда все они перекрываются. –

0

Не пробовал, но вы можете попробовать разместить все в UIScrollView, и всякий раз, когда вы обнаруживаете изменение уровня масштабирования, настройте все преобразования дочернего вида на CGAffineTransformMakeScale(1.0, 1.0/zoomLevel). Таким образом, scrollview масштабирует все, но каждый subview масштабируется вертикально вниз, отменяя масштаб.

+0

Я подозреваю, вы на правильном пути, мои усилия пока еще не работали, хотя, где вы установить это аффинное преобразование в подпунктах? –

+0

В обратном вызове делегата 'scrollViewDidZoom'. Не пробовал, хотя. – Jason

+0

Извините, что я имел в виду, какой селектор я вызываю в подзонах, т. Е .: [subview setЧто-то: CGAffineTransformMakeScale (1.0, 1.0/zoomLevel)]; –

8

Я реализовал горизонтальный только масштабирование, создав подкласс UIView, который просто переопределяет SetTransform и устанавливает шкалу Y 1 каждый раз, когда UIScrollView изменяет масштаб:

@interface DiagramStripView : UIView { } 
@end 

@implementation DiagramStripView 

- (void)setTransform:(CGAffineTransform)newValue; 
{ 
    newValue.d = 1.0; 
    [super setTransform:newValue]; 
} 

@end 

Как следует из названия класса, мой view содержит ряд диаграмм, каждый из которых имеет ширину экрана. Когда пользователь отпускает, контроллер вида сбрасывает масштаб вида по 1 и перерисовывает все к новой шкале:

- (void) scrollViewDidEndZooming:(UIScrollView *)scrollView 
         withView:(UIView *)view atScale:(float)scale 
{ 
    diagramStripView.transform = CGAffineTransformIdentity; 
    [self redrawDiagrams:scale]; 
} 
+0

Если вы используете эту технику в сочетании с черепичным видом (как ваш взгляд на масштабирование), тогда вы получите действительно красивое горизонтально масштабируемое представление временной шкалы, которое будет только рисовать то, что ему нужно. – CaseyB

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