2015-07-12 107 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

我設置了一個開頭和結尾的空間,它的父,有什麼ai的做錯了什麼?

回答

0

viewDidAppear當您查看時會在屏幕上顯示並且每次從您的導航流程中的其他視圖控制器返回時執行。所以你的代碼多次添加行。您可以查看視圖控制器生命週期here

如果要刪除「延遲」並執行一次,請在viewDidLoad中編寫代碼。

UPDATE

我看到了兩種方法。創建一個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: 
    

我用的CALayer與UIBezierPath解決方案線連接這source code。觸摸按鈕並在改變時看到差異。

+0

這就是爲什麼我把它放到viewdidlayoutsubviews,因爲在那個階段它知道按鈕的寬度是多少,什麼不是在viewdidload中的情況 – Markus

+0

你是對的,但在'viewDidLoad'你有真正的根視圖框架。它允許你用幾種方法來解決它。不過,我建議你忘記CALayer並使用'drawRect'。我編輯了我的答案。 – torcelly

+0

嘿torcelly,謝謝你的負擔,我不知道它是否只是我的一些奇怪的設置,但drawRect方法與按鈕內部的標題前面的工件(在您的xcode項目中)相同,但不是我可能會使用後者的解決方案解決方案......謝謝 – Markus

相關問題