2014-01-13 3 views
2

У меня есть UIScrollView, содержащийся в другом представлении контейнера с ограничениями, установленными на все пространство контейнера. То есть, у меня нет фиксированной ширины или высоты в прокрутке.
В моем прокрутке я программно добавляю subviews. Каждое подвью (содержимое) загружается из xib.
В xib я устанавливаю произвольный размер в корневой вид (500x500), но я бы хотел, чтобы ширина этого вида автоматически изменялась до ширины вида прокрутки (ширина прокрутки - ширина контейнера).
Я не хочу, чтобы пользователь мог прокручивать по горизонтали.Как настроить размер содержимого UIScrollView на фиксированную ширину и динамическую высоту?

Я пробовал различные решения, в результате чего прокрутка была прокручиваемой по горизонтали.
Я попытался настроить свойство обнимания и сжатия содержимого на разные значения по горизонтальной оси без каких-либо успехов.

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

Спасибо заранее, если у вас есть предложения.

ответ

3

Поздний ответьте тем, что я придумал в то время.
Как я использую Autolayout, ответ VChemezov на самом деле не удовлетворяет.

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

Так что теперь у меня есть что-то вроде этого:

 NSLayoutConstraint *leading = [NSLayoutConstraint 
             constraintWithItem:messageView 
             attribute:NSLayoutAttributeLeading 
             relatedBy:NSLayoutRelationEqual 
             toItem:self.conversationScrollView 
             attribute:NSLayoutAttributeLeading 
             multiplier:1.0f 
             constant:0.0f]; 
     NSLayoutConstraint *width = [NSLayoutConstraint 
             constraintWithItem:messageView 
             attribute:NSLayoutAttributeWidth 
             relatedBy:NSLayoutRelationEqual 
             toItem:self.conversationScrollView 
             attribute:NSLayoutAttributeWidth 
             multiplier:1.0f 
             constant:0.0f]; 
     [self.conversationScrollView addConstraints:@[ top, leading, width ]]; 

С шириной зрения содержания, равной ширине зрения прокрутки.

+0

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

2

Autolayout не будет изменять размер вида внутри UIScrolView. Вы должны сами планировать и изменять размеры этих представлений. Существует два основных решения:

  • Явное устанавливается ширина подвид перед добавлением его к UIScrollView
  • Подкласс UIScrollView и переопределить setFrame и layoutSubviews как это

    @implementation MyScrollView 
    
    - (void)setFrame:(CGRect)frame{ 
        [super setFrame:frame]; 
        [self setNeedsLayout]; 
    } 
    
    - (void)layoutSubviews{ 
        [super layoutSubviews]; 
        NSArray * subviews=self.subviews; 
        for(UIView * view in subviews){ 
         CGRect viewFrame=view.frame; 
         viewFrame.size.width=self.bounds.size.width; 
         view.frame=viewFrame; 
        } 
    } 
    
    @end 
    
1

Использование SnapKit это еще быстрее:

let helper = UIView() 
scrollView.addSubview(helper) 

helper.snp.makeConstraints { make in 
    make.width.equalTo(snp.width) 
    make.leading.trailing.top.equalToSuperview() 
    make.height.equalTo(0) 
} 
+0

+1 потому что это определенно путь. 2014 => 2017. Используйте SnapKit или PureLayout, но не используйте собственный API Autolayout (если у вас слишком много времени). – florian

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