用于自动调整 UIView 的圆角
Posted
技术标签:
【中文标题】用于自动调整 UIView 的圆角【英文标题】:Round corners for autosizing UIView 【发布时间】:2012-05-28 15:21:41 【问题描述】:是否可以制作圆角(topLeft 和 topRight)来自动调整 uiview? 这是我的代码:
SFDetailViewController.h
@interface SFDetailViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate, PopoverViewListDelegate>
...
UIView *header;
@property (nonatomic, retain) IBOutlet UIView *header;
@end
SFDetailViewController.m
#import "SFDetailViewController.h"
#import <QuartzCore/QuartzCore.h>
@interface SFDetailViewController ()
@end
@implementation SFDetailViewController
@syntesyze header;
-(void) viewDidLoad
....
[self setCornerRadiusToHeader:header];
-(void) setCornerRadiusToHeader:(UIView *)headerView
CGRect bounds = headerView.layer.bounds;
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds
byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)
cornerRadii:CGSizeMake(8.0, 8.0)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = bounds;
maskLayer.path = maskPath.CGPath;
[headerView.layer addSublayer:maskLayer];
headerView.layer.mask = maskLayer;
视图在 IB 中定义为:
我得到的 - 右上角是直的,因为视图的大小是动态的。
【问题讨论】:
【参考方案1】:您需要将UIView
的contentMode
属性设置为UIViewContentModeRedrew
之类的属性。内容模式控制视图的内容在其边界发生变化时如何变化(如自动调整大小时)。默认情况下,它只是拉伸视图的内容,这就是你的角被拉伸的原因。
【讨论】:
【参考方案2】:解决方案:
感谢jbrennan,我设置了
header.contentMode = UIViewContentModeRedraw;
然后,在 viewDidLoad 我调用:
[header setNeedsDisplay];
顺便说一句,我写了以下内容:(void)drawRect:(CGRect)rect
:
- (void)drawRect:(CGRect)rect
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, rect);
UIColor *color = [UIColor lightGrayColor];
CGContextSetFillColorWithColor(context, color.CGColor);
CGRect rrect = CGRectMake(CGRectGetMinX(rect)-2, CGRectGetMinY(rect), CGRectGetWidth(rect)+4, CGRectGetHeight(rect) + 1);
CGFloat radius = 10.0f;
CGFloat minx = CGRectGetMinX(rrect), midx = CGRectGetMidX(rrect), maxx = CGRectGetMaxX(rrect);
CGFloat miny = CGRectGetMinY(rrect), midy = CGRectGetMidY(rrect), maxy = CGRectGetMaxY(rrect);
CGContextMoveToPoint(context, minx, midy);
CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, 0);
CGContextAddArcToPoint(context, minx, maxy, minx, midy, 0);
CGContextClosePath(context);
CGContextDrawPath(context, kCGPathFill);
结果:
【讨论】:
以上是关于用于自动调整 UIView 的圆角的主要内容,如果未能解决你的问题,请参考以下文章