2014-03-19 1 views
1

У меня проблема с UIControl и Autolayout. Я создал пользовательский UIControl, затем добавляю его с помощью Interface Builder, а затем добавляю ограничения. Элемент управления похож на UIPageControl и работает следующим образом: для каждой страницы добавляется одна точка и изменяется ширина элемента управления. Проблема в том, что я не знаю, как программно изменить размер UIControl и сохранить управление с помощью Autolayout.Изменение ширины пользовательского UIControl и сохранение в центре с помощью Autolayout

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

Спасибо!

enter image description here

EDIT 1

Вот код, когда я обновляю подсчет точек:

- (void)reloadNumberOfPages:(NSUInteger)pages { 

    // Remove previous images 
    for (UIView *v in self.subviews) { 
     [v removeFromSuperview]; 
    } 

    // Change size 
    CGFloat width = _dotSize.width * pages; 
    CGPoint center = self.center; 

    // Change size 
    self.frame = ({ 

     CGRect frame = self.frame; 
     frame.size.width = width; 
     frame.size.height = _dotSize.height; 
     frame; 

    }); 
    self.center = center; 

    // Add images 
    CGFloat offSet = 0.0; 
    for (int x = 0; x < pages; x++) { 

     // Image 
     UIImageView *dot = [[UIImageView alloc] initWithImage:_dotOFF 
              highlightedImage:_dotON]; 
     dot.frame = CGRectMake(offSet, 0.0, _dotSize.width, _dotSize.height); 
     dot.center = CGPointMake(CGRectGetMidX(dot.frame), CGRectGetHeight(self.bounds)/2.0); 
     dot.tag = x; 
     [self addSubview:dot]; 

     // Añadimos offSet 
     offSet += CGRectGetWidth(dot.bounds); 

    } 

} 

UPDATE 1

Я пытаюсь с "intrinsicContentSize" но он не работает

- (void)reloadNumberOfPages:(NSUInteger)pages { 

    // Add images 
    CGFloat offSet = 0.0; 
    for (int x = 0; x < pages; x++) { 

     // Image 
     UIImageView *dot = [[UIImageView alloc] initWithImage:_dotOFF 
              highlightedImage:_dotON]; 
     dot.frame = CGRectMake(offSet, 0.0, _dotSize.width, _dotSize.height); 
     dot.center = CGPointMake(CGRectGetMidX(dot.frame), CGRectGetHeight(self.bounds)/2.0); 
     dot.tag = x; 
     [self addSubview:dot]; 

     // Añadimos offSet 
     offSet += CGRectGetWidth(dot.bounds); 

    } 

    [self invalidateIntrinsicContentSize]; 

} 

- (CGSize)intrinsicContentSize { 
    return CGSizeMake(_dotSize.width * _numberOfPages, _dotSize.height); 
} 
+0

Как вы меняете ширину? Внутренний размер содержимого? Показать код. – Wain

+0

Wain, я обновил вопрос. Благодаря! – mhergon

+0

Является ли желтая коробка на скриншоте цветом фона этого контроллера? I.e., являются ли точки, выходящие за пределы его рамки? И устанавливаете ли вы ограничения в IB или в коде? –

ответ

0

Если вы используете автозапуск, чтобы разместить свое собственное представление, вы не должны устанавливать его рамку или центр. Избавиться от self.frame = и self.center = линий и осуществлять intrinsicContentSize:

-(CGSize)intrinsicContentSize { 
    return CGSizeMake(_dotSize.width * pages, _dotSize.height); 
} 
+0

И вызвать 'invalidateIntrinsicContentSize' ... – Wain

+0

Я обновил вопрос, но не работает :( – mhergon

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