5

uiviewの自動サイズ設定に丸みを帯びた角(topLeftとtopRight)を作成することは可能ですか?これが私のコードです:

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コーナーはまっすぐです。

結果

4

2 に答える 2

2

UIViewcontentModeプロパティをのようなものに設定する必要がありますUIViewContentModeRedrew。コンテンツモードは、境界が変更されたとき(自動サイズ変更時など)にビューのコンテンツがどのように変化するかを制御します。デフォルトでは、ビューのコンテンツを拡大するだけなので、コーナーが拡大されます。

于 2012-05-28T15:32:07.667 に答える
1

解決:

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

}

結果:

結果

于 2012-05-28T16:35:30.450 に答える