2012-11-27 3 views
5

Ich zeichne die Sprechblase mit UIBezierpath in einer UIView Klasse. In der View-Klasse enthalten die UITextView. Ich verwende den folgenden Code zum Zeichnen der Sprechblase.Wie zeichne ich die Sprechblase als UITextview ContentSize

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

//BezierPath.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; 
} 

Mein Gedanke ist, dass, wenn ich den Text in der Textansicht eingegeben habe ich die Sprechblase Größe erhöhen möchten basierend auf dem Text der Textansicht. Aber meine Sprechblase Größe wird nicht korrekt erhöht. Wie löse ich dieses Problem?

+3

Nizza Frage Bruder – Ben10

Antwort

1

Sie lösen das Neuzeichnen aus, wenn der Text geändert wird?

Im textViewDidChange Methode hinzufügen ...

[self setNeedsDisplay]; 

... als letzte Zeile.

Dadurch wird die drawRect-Methode erneut ausgelöst.

+0

Ich kann nicht die CGContexRef-Methode innerhalb der TextViewdidChange –

+0

Sie nicht müssen. Fügen Sie einfach die einzelne Codezeile hinzu, die ich gesagt habe [sepf setNeedsDisplay]; nichts anderes – Fogmeister

+0

Dank Lot es funktionierte perfekt –

Verwandte Themen