您的位置:首页 > 产品设计 > UI/UE

iphone ios uiview uilabel 边框,圆角,阴影实现

2012-12-20 09:57 411 查看


Fun with layers

In this post, I’ll explain how to add a border, rounded corners, and drop shadow to any
UIView
using some simple
CALayer
properties. I’m not a
CALayer
guru, but these few tricks from the layer world are particularly nice to know about.
These properties are present for every
UIView
, since every view is actually drawn using an underlying
CALayer
object owned by the UIView. You can do a lot without even knowing about
CALayer
s because
UIView
s encapsulate a lot of their functionality. These properties, however, are useful pieces that are not
available directly through the
UIView
interface.
To use these properties, you need to include the QuartzCore header:

#import <QuartzCore/QuartzCore.h>


Borders

To get a border, just set the
borderColor
and
borderWidth
properties of the layer, for example:

label.layer.borderColor
=
[UIColor blueColor].CGColor;

label.layer.borderWidth
=
1;

The
borderColor
is a
CGColorRef
, which you can easily extract from any
UIColor
as in the above example, which generates a border like this:



The border is just inside the frame of the view. Fractional values are allowed for the
borderWidth
as well.


Corners

You can create rounded corners with code like this:

label.layer.cornerRadius
=
20;

label.layer.borderColor
=
[UIColor grayColor].CGColor;

label.layer.borderWidth
=
3;

just the
cornerRadius
property is needed; I’ve also set the border to show how these properties work together:



As you can see in the example screenshot, the
backgroundColor
of the
UIView
is also restricted by the corner radius. You need to have
clipsToBounds
set to
YES

on your
UIView
for rounded corners to work.


Shadows

You can also create a drop shadow that will be based on the alpha component of whatever is drawn in your view. Often this will result in a shadow just around the edges of the view. This example
code on a
UILabel
:

label.layer.shadowColor
=
[UIColor blackColor].CGColor;

label.layer.shadowOpacity
=
1.0;

label.layer.shadowRadius
=
5.0;

label.layer.shadowOffset
= CGSizeMake(0,

3);

label.clipsToBounds
=NO;

results in this appearance:



In this case, you need
clipsToBounds
to be
NO

in order for a shadow outside the frame of your view to show up. Next I’ll show you how you can actually combine rounded corners and drop shadows, since I’m sure that’s what you really want to do now.


All together

Let’s say you want to present an image with a border, rounded corners, and a drop shadow. The obvious problem from the above explanations is that
clipsToBounds
needs to be
YES

for the rounded corners to work and
NO

for the drop shadows. What’s a coder to do?
We can get around this apparent paradox by using the fact that the
CALayer
treats its own background color (which may be image-based) differently than the
UIView
‘s background color. Specifically, we can set
clipsToBounds
to
NO

and still achieve rounded corners by using direct properties of the layer instead of the
UIView
. This code:UIView
*imgView
=
[[[UIView
alloc] initWithFrame:imgFrame]
autorelease];

imgView.backgroundColor
=
[UIColor clearColor];

UIImage
*image
=
[UIImage imageNamed:@"mandel.png"];

imgView.layer.backgroundColor
=
[UIColor colorWithPatternImage:image].CGColor;

// Rounded corners.

imgView.layer.cornerRadius
=
10;

// A thin border.

imgView.layer.borderColor
=
[UIColor blackColor].CGColor;

imgView.layer.borderWidth
=
0.3;

// Drop shadow.

imgView.layer.shadowColor
=
[UIColor blackColor].CGColor;

imgView.layer.shadowOpacity
=
1.0;

imgView.layer.shadowRadius
=
7.0;

imgView.layer.shadowOffset
= CGSizeMake(0,

4);

Generates the image on the right, using the left image as the source (mandel.png):




Reference

I originally learned about this stuff from

this blog post.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: