5

UIBezierpath我在UIView课堂上使用了语音气泡。在视图类中包含 UITextView。我正在使用以下代码来绘制语音气泡。

//BezierPathView.h

@interface BezierpathView :  UIView<UITextViewDelegate>{

CGFloat animatedDistance;

UITextView *LXVolabel;
UIView *view;
UIBezierPath* speechBubbleTopPath;
UIBezierPath* rectanglePath;
UIBezierPath* speechBubbleBottomPath;
UIColor* darkGray;
UIColor* shadow;
CGSize shadowOffset;
CGFloat shadowBlurRadius;
NSString* textContent;
}
 @property(nonatomic,strong)UIView *view;
 @property(nonatomic,strong)UITextView *LXVolabel;

//贝塞尔路径.m

@implementation BezierpathView
@synthesize LXVolabel,view;
- (id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
    self.backgroundColor = [UIColor clearColor];
    self.LXVolabel = [[UITextView alloc]initWithFrame:CGRectMake(0, 0,self.frame.size.width , self.frame.size.height-10)];
    self.LXVolabel.backgroundColor = [UIColor clearColor];
    self.LXVolabel.delegate = self;
    self.LXVolabel.font = [UIFont systemFontOfSize:20];

    [self addSubview:self.LXVolabel];

    CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
    view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, applicationFrame.size.width, applicationFrame.size.height)];


    // Color Declarations
    darkGray = [UIColor grayColor];

    // Shadow Declarations
    shadow= [UIColor blackColor];
    shadowOffset= CGSizeMake(0, 1);
    shadowBlurRadius= 1;

    // Abstracted Graphic Attributes
    textContent= LXVolabel.text;

}
return self;
}
 - (void)drawRect:(CGRect)rect
 {
[super drawRect:rect];
  CGContextRef  context = UIGraphicsGetCurrentContext();

   // Drawing code

//// General Declarations

// speechBubbleTop Drawing
speechBubbleTopPath = [UIBezierPath bezierPath];
[speechBubbleTopPath moveToPoint: CGPointMake(294, 7)];
[speechBubbleTopPath addCurveToPoint: CGPointMake(288, -0) controlPoint1: CGPointMake(294, 3.13) controlPoint2: CGPointMake(291.31, -0)];
[speechBubbleTopPath addLineToPoint: CGPointMake(8, -0)];
[speechBubbleTopPath addCurveToPoint: CGPointMake(2, 7) controlPoint1: CGPointMake(4.69, -0) controlPoint2: CGPointMake(2, 3.13)];
[speechBubbleTopPath addLineToPoint: CGPointMake(294, 7)];
[speechBubbleTopPath closePath];
[darkGray setFill];
[speechBubbleTopPath fill];



  // Rectangle Drawing
  rectanglePath = [UIBezierPath bezierPathWithRect: CGRectMake(2, 6, 292,self.frame.size.height-15)];
CGContextSaveGState(context);
CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
[darkGray setFill];
[rectanglePath fill];
CGContextRestoreGState(context);



// Text Drawing
CGRect textRect = CGRectMake(7, 6, 292, self.frame.size.height-15);
CGContextSaveGState(context);
CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
[[UIColor whiteColor] setFill];
[textContent drawInRect: textRect withFont: [UIFont fontWithName: @"Helvetica-Light" size: 14] lineBreakMode: NSLineBreakByWordWrapping alignment: NSTextAlignmentLeft];
//CGContextRestoreGState(context);

float addedHeight = 100 -38;

[self drawPath:addedHeight contextValue:context];
//speechBubbleBottom Drawing


speechBubbleBottomPath = [UIBezierPath bezierPath];
[speechBubbleBottomPath moveToPoint: CGPointMake(2, 24+addedHeight)];
[speechBubbleBottomPath addCurveToPoint: CGPointMake(8, 30+addedHeight) controlPoint1: CGPointMake(2, 27.31+addedHeight) controlPoint2: CGPointMake(4.69, 30+addedHeight)];
[speechBubbleBottomPath addLineToPoint: CGPointMake(13, 30+addedHeight)];
[speechBubbleBottomPath addLineToPoint: CGPointMake(8, 42+addedHeight)];
[speechBubbleBottomPath addLineToPoint: CGPointMake(25, 30+addedHeight)];
[speechBubbleBottomPath addLineToPoint: CGPointMake(288, 30+addedHeight)];
[speechBubbleBottomPath addCurveToPoint: CGPointMake(294, 24+addedHeight) controlPoint1: CGPointMake(291.31, 30+addedHeight) controlPoint2: CGPointMake(294, 27.31+addedHeight)];
[speechBubbleBottomPath addLineToPoint: CGPointMake(2, 24+addedHeight)];
[speechBubbleBottomPath closePath];
CGContextSaveGState(context);
CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
[darkGray setFill];
[speechBubbleBottomPath fill];
CGContextRestoreGState(context);

}
 -(void)textViewDidChange:(UITextView *)textView{
CGRect rect = textView.frame;
rect.size.height = textView.contentSize.height;// Adding.size Since height is not a member of CGRect
  self.frame = CGRectMake(10, 20, textView.frame.size.width, textView.contentSize.height+20);
   textView.frame = rect;
 }

我的想法是,当我在文本视图中输入文本时,我想根据文本视图的文本增加对话气泡的大小。但是我的语音气泡大小没有正确增加。我该如何解决这个问题?

4

1 回答 1

1

更改文本时是否触发重绘?

在 textViewDidChange 方法中添加...

[self setNeedsDisplay];

...作为最后一行。

这将再次触发 drawRect 方法。

于 2012-11-27T09:02:56.040 回答