2012-05-28 40 views
5

是否可以使圆角(topLeft和topRight)自动化uiview? 这是我的代码:用于自动化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定义为:

IB

我得到的东西 - topRight角是直的,因为视图的大小是动态的。

result

回答

2

您需要将UIViewcontentMode属性设置为类似UIViewContentModeRedrew。内容模式控制视图内容在其边界发生变化时的变化(如自动调整大小时)。默认情况下,它只是延伸视图的内容,这就是为什么你的角落拉伸。

1

SOLUTION:

感谢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); 

} 

结果:

result