2015-07-12 22 views
0

Я пытаюсь добавить верхнюю и нижнюю границу на UIButton мою функцию, чтобы добавить границы выглядит следующим образомUIButton Верхняя и нижняя граница дополнительной линии

CALayer *topBorder = [CALayer layer]; 

    topBorder.frame = CGRectMake(os, 1.0f, b.bounds.size.width - (os * 2.0f), 1.0f); 

    topBorder.backgroundColor = [c1 CGColor]; 

    [b.layer addSublayer:topBorder]; 

    CALayer *bottomBorder = [CALayer layer]; 

    bottomBorder.frame = CGRectMake(os, b.bounds.size.height, b.bounds.size.width - (os * 2.0f), 1.0f); 

    bottomBorder.backgroundColor = [c1 CGColor]; 

    [b.layer addSublayer:bottomBorder]; 

    //os..offset, b..uibutton, c1..color 

это прекрасно работает, когда я вызвать функцию в viewDidAppear (но есть задержка, то), но когда я положил его в viewdidlayoutsubviews добавляет дополнительную строку, то, что как-то выглядит как этот enter image description here

я поставил его с ведущей и ведомой пространство его надтаблицы, что д.в. здесь делаю неправильно ?

ответ

0

viewDidAppear Выполняется, когда вы просматриваете, появляется на экране и каждый раз возвращается с другого контроллера вида в вашем потоке навигации. Таким образом, ваш код добавляет строки несколько раз. Вы можете просмотреть жизненный цикл контроллера вида here.

Если вы хотите удалить «задержку» и выполнить один раз, напишите свой код в viewDidLoad.

ОБНОВЛЕНИЕ

Я вижу два подхода. Создайте подкласс UIButton, а затем:

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

  2. Хороший. Я рекомендую использовать «drawRect» для рисования этих строк и использовать рамку кнопок для динамического вычисления строки XY. Если вы нажмете кнопку изменить свой размер, анимированный или нет ... нет проблем, Core Animation выполнит всю работу.

    - (void)drawRect:(CGRect)rect 
    { 
        // Frames 
        CGRect frame = self.bounds; 
    
        // Parameters (change these values if you want to change appearance) 
        UIColor *lineColor = [UIColor colorWithRed: 0.5 green: 0.5 blue: 0.5 alpha: 1]; 
        CGFloat topRatioPositionY = 0.02; 
        CGFloat middleRatioPositionY = 0.6; 
        CGFloat bottomRatioPositionY = 0.98; 
        CGFloat middleRatioPositionX = 0.33333; 
        CGFloat lineWidth = 1.0; 
    
        //// Top line 
        UIBezierPath* bezierPath = [UIBezierPath bezierPath]; 
        [bezierPath moveToPoint: CGPointMake(CGRectGetMinX(frame), CGRectGetMinY(frame) + topRatioPositionY * CGRectGetHeight(frame))]; 
        [bezierPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 1.00000 * CGRectGetWidth(frame), CGRectGetMinY(frame) + topRatioPositionY * CGRectGetHeight(frame))]; 
        [lineColor setStroke]; 
        bezierPath.lineWidth = lineWidth; 
        [bezierPath stroke]; 
    
    
        // Middle line 
        UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; 
        [bezier2Path moveToPoint: CGPointMake(CGRectGetMinX(frame), CGRectGetMinY(frame) + bottomRatioPositionY * CGRectGetHeight(frame))]; 
        [bezier2Path addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 1.00000 * CGRectGetWidth(frame), CGRectGetMinY(frame) + bottomRatioPositionY * CGRectGetHeight(frame))]; 
        [lineColor setStroke]; 
        bezier2Path.lineWidth = lineWidth; 
        [bezier2Path stroke]; 
    
    
        // Bottom Line 
        UIBezierPath* bezier3Path = [UIBezierPath bezierPath]; 
        [bezier3Path moveToPoint: CGPointMake(CGRectGetMinX(frame), CGRectGetMinY(frame) + middleRatioPositionY * CGRectGetHeight(frame))]; 
        [bezier3Path addLineToPoint: CGPointMake(CGRectGetMinX(frame) + middleRatioPositionX * CGRectGetWidth(frame), CGRectGetMinY(frame) + middleRatioPositionY * CGRectGetHeight(frame))]; 
        [lineColor setStroke]; 
        bezier3Path.lineWidth = lineWidth; 
        [bezier3Path stroke]; 
    
    }// drawRect: 
    

Я прикрепил source code с линиями с CALayer и с UIBezierPath решениями. Нажмите на кнопки и увидите разницу, когда они меняются.

+0

вот почему я положил его в viewdidlayoutsubviews, потому что на этом этапе он знает, насколько широка будет кнопка, что не так в viewdidload – Markus

+0

Вы правы, но в 'viewDidLoad' у вас есть реальный корневой вид. Это позволяет вам несколько способов решить эту проблему. Однако я рекомендую вам забыть CALayer и использовать 'drawRect'. Я отредактировал свой ответ. – torcelly

+0

привет, спасибо, за то, что вы себе это позволяете, я не знаю, делает ли это просто какая-то странная настройка моей, но метод drawRect делает то же самое с этим артефактом перед заголовком внутри кнопки (в вашем проекте xcode), но не решение calayer я, вероятно, воспользуюсь более поздним ... спасибо – Markus

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