2016-05-14 81 views
5

我有下面一段代碼圓一個視圖只有特定的角落:和圓形邊角具體顯示在特定邊陰影只

- (void)roundOnlySpecifiedCornersInView:(UIView *)view corners:(UIRectCorner)corners 
{ 
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:(corners) cornerRadii:CGSizeMake(4.0, 4.0)]; 
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 

    maskLayer.path = maskPath.CGPath; 
    view.layer.mask = maskLayer; 
} 

這工作完全孤立。現在我也想影子在我的觀點,但我特別希望在不同的情況下,申請陰影:除了底部

  • 各方

    • 四面八方
    • 各方除頂部
    • 左/右側只有

    我遇到的所有技巧都是通過創建視圖的插圖來實現的。與此相關的問題是,如果您只想保留左側/右側的陰影,則會抵消底部和頂部。由於Rect現在不高,因此左側和右側的陰影不能覆蓋視圖的整個高度。而且,用於倒角的掩模層會導致陰影不再出現。

    此示例代碼:

    innerView.layer.shadowColor = [[UIColor colorWithWhite:0.0f alpha:0.1f] CGColor]; 
        innerView.layer.shadowOpacity = 1.0f; 
        innerView.layer.shadowOffset = CGSizeMake(0.0f, 0.0f); 
        innerView.layer.shadowRadius = 6.0f; 
    
        CGRect shadowFrame = UIEdgeInsetsInsetRect(innerView.bounds, UIEdgeInsetsMake(9, 0, 9, 0)); 
        CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:shadowFrame].CGPath; 
    
        innerView.layer.shadowPath = shadowPath; 
    

    如何我只能在特定圓邊邊角特定視圖中,並在同一時間顯示的影子呢?

    在Swift中的答案也很感謝!

    截圖的我想要的東西(這一個是容易的,因爲各個角落需要進行四捨五入,所以我可以用.layer.cornerRadius,它在各方面的有陰影): enter image description here

    現在我只想只有2圓角落(左上角和右上角,左下角和右下角)並且只在一些邊添加陰影。

  • +0

    你可以顯示你有什麼/想要的截圖嗎? – jtbandes

    +0

    http://stackoverflow.com/questions/22679886/how-to-make-a-uiview-with-optional-rounded-corners-and-border/22680538#22680538 –

    +0

    @KiritModi你指的是完全相同的代碼我已經有了圓角。 – edwardmp

    回答

    3

    我不確定它是否符合您的要求。代碼創建一個帶有頂部和底部陰影的圖像,以及所有圓角,您可以修改代碼以實現所需。你可以使用圖像作爲你的手機背景(看起來它是UITableViewCell

    讓我知道它是否不適合你。

    的圖像:

    enter image description here

    // create a shadow image 
    CGSize size = CGSizeMake(ScreenWidth, ScreenWidth); 
    UIGraphicsBeginImageContextWithOptions(size, NO, 0); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    
    UIColor *backgroundColor = [UIColor colorWithRed:246.0/255.0 green:246.0/255.0 blue:246.0/255.0 alpha:1.0]; 
    UIColor *fillColor = [UIColor whiteColor]; 
    CGRect rect = CGRectMake(10, 10, 100, 44); 
    
    // re-draw the background 
    CGContextSetFillColorWithColor(context, backgroundColor.CGColor); 
    CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height)); 
    
    // set top and bottom shadow 
    CGRect rectTop = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, 5); 
    CGContextSaveGState(context); 
    CGContextSetShadowWithColor(context, CGSizeMake(0, -5), 5, [UIColor colorWithRed:0 green:0 blue:0 alpha:0.1].CGColor); 
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); 
    CGContextFillRect(context, rectTop); 
    CGContextRestoreGState(context); 
    
    CGRect rectBottom = CGRectMake(rect.origin.x, rect.origin.y+rect.size.height-5, rect.size.width, 5); 
    CGContextSaveGState(context); 
    CGContextSetShadowWithColor(context, CGSizeMake(0, 5), 5, [UIColor colorWithRed:0 green:0 blue:0 alpha:0.1].CGColor); 
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); 
    CGContextFillRect(context, rectBottom); 
    CGContextRestoreGState(context); 
    
    // re-draw the background 
    CGContextSetFillColorWithColor(context, backgroundColor.CGColor); 
    CGContextFillRect(context, rect); 
    
    CGContextSaveGState(context); 
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(4.0, 4.0)]; 
    [maskPath addClip]; 
    CGContextSetFillColorWithColor(context, fillColor.CGColor); 
    CGContextFillRect(context, rect); 
    CGContextRestoreGState(context); 
    

    您可以修改代碼以獲得左上陰影:

    enter image description here

    // create a shadow image 
    CGSize size = CGSizeMake(ScreenWidth, ScreenWidth); 
    UIGraphicsBeginImageContextWithOptions(size, NO, 0); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    
    UIColor *backgroundColor = [UIColor colorWithRed:246.0/255.0 green:246.0/255.0 blue:246.0/255.0 alpha:1.0]; 
    UIColor *fillColor = [UIColor whiteColor]; 
    CGRect rect = CGRectMake(10, 10, 100, 44); 
    
    // re-draw the background 
    CGContextSetFillColorWithColor(context, backgroundColor.CGColor); 
    CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height)); 
    
    // set top and left shadow 
    CGRect rectTop = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, 5); 
    CGContextSaveGState(context); 
    CGContextSetShadowWithColor(context, CGSizeMake(0, -5), 5, [UIColor colorWithRed:0 green:0 blue:0 alpha:0.1].CGColor); 
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); 
    CGContextFillRect(context, rectTop); 
    CGContextRestoreGState(context); 
    
    CGRect rectLeft = CGRectMake(rect.origin.x, rect.origin.y, 5, rect.size.height); 
    CGContextSaveGState(context); 
    CGContextSetShadowWithColor(context, CGSizeMake(-5, 0), 5, [UIColor colorWithRed:0 green:0 blue:0 alpha:0.1].CGColor); 
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); 
    CGContextFillRect(context, rectLeft); 
    CGContextRestoreGState(context); 
    
    // re-draw the background 
    CGContextSetFillColorWithColor(context, backgroundColor.CGColor); 
    CGContextFillRect(context, rect); 
    
    CGContextSaveGState(context); 
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(4.0, 4.0)]; 
    [maskPath addClip]; 
    CGContextSetFillColorWithColor(context, fillColor.CGColor); 
    CGContextFillRect(context, rect); 
    CGContextRestoreGState(context); 
    

    HTH

    +0

    感謝您的回答。對於陰影,我只想念左右兩邊添加陰影,但我想我可以從你的答案中得出它。 – edwardmp

    -1

    特定角落組邊角半徑

    是指來自:how to set cornerRadius for only top-left and top-right corner of a UIView?

    UIBezierPath *maskPath; 
    maskPath = [UIBezierPathbezierPathWithRoundedRect:_backgroundImageView.bounds 
              byRoundingCorners:(UIRectCornerBottomLeft|UIRectCornerBottomRight) 
                cornerRadii:CGSizeMake(3.0, 3.0)]; 
    
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 
    maskLayer.frame = self.bounds; 
    maskLayer.path = maskPath.CGPath; 
    _imageView.layer.mask = maskLayer; 
    [maskLayer release]; 
    
    +0

    您的代碼與我在開場白中提供的代碼幾乎相同(同一個區塊) – edwardmp

    1

    在你想用繪畫的影子,當然要做到這一點很多,很多情況下。但是,您可以考慮採用以下方法:使用可伸縮圖像,並在您需要的兩側放置陰影,例如,類似的東西(這其中有在各方面的影子,雖然):

    enter image description here

    你說就在:「Ewwwww他是使用圖像的一個簡單的陰影!」我要強調,這將工作在性能方面更好。例如,如果您在UICollectionView中有很多單元格,並且每個單元格都在重新繪製它的陰影,則在滾動過程中它可能會顯着減慢您的應用程序的速度,而使用基於圖像的陰影則會基本相同。

    我會更進一步,並建議您實際上可以使用可拉伸的圖像掩蓋視圖與圓角,太!現在,這可能看起來有點過頭了,但如果你注意到性能的急劇下降,我會給它一個鏡頭。你基本上需要做的是準備另一個帶有透明「中間」部分和與背景顏色相同的圓角的可拉伸圖像。喜歡的東西:

    enter image description here

    再次,你downvote做的事情可以用兩行代碼可以輕鬆實現這一離奇的方式之前...

    view.layer.cornerRadius = 20 
    view.layer.masksToBounds = true 
    

    ...讓我點在這種情況下,當你必須同時顯示一大堆被屏蔽的視圖的時候,這可以更快地工作:例如,屏蔽UICollectionViewCell s。基本上,如果在UIView的圖層上設置蒙版,該蒙版將要重新計算並實時應用,這會在頻繁重繪UIView內容時在性能方面造成很大影響 - 滾動時例如,UITableViewUICollectionView

    顯然,如果您的背景不是純色,並且具有實例的漸變效果,則無效。但是,在許多其他情況下,這可能會幫助您實現更平滑的UI性能。在特定情況下的另一個優點是,您可以輕鬆控制要遮罩哪些角以及陰影應該放在哪裏。

    再次,我並不是暗示這是每種情況下去的方式。我所說的是,在很多情況下,這可以顯着提高性能:例如,如果屏蔽了同時在屏幕上呈現的太多視圖,並且預計佈局經常重新繪製。