2012-05-22 3 views
0

Я использую CoreText для рисования текста в нескольких столбцах (в зависимости от ориентации iPad).пользовательский uiscrollview не прокручивает (используя coretext)

Чтобы проверить, я создал NSMutableString, состоящую из чисел 100 - 999. Этот текст охватывает 5 столбцов, 1 или 2 из которых находятся на экране (в зависимости от ориентации).

К моему основному ViewController Я добавил пользовательский UIScrollView для хранения этого текста, и я хочу, чтобы он был прокручиваемым.

Я заметил, что Scrollview не прокручивается, пока не установлено:

[myScrollView setContentMode: UIViewContentModeRedraw];

Я хочу, чтобы scrollView вызывал drawRect, когда iPad вращается (чтобы отрегулировать количество столбцов)!

Моя проблема заключается в том, что она, кажется, вызывает drawRect снова и снова ... при прокрутке (и тем самым выделяет все больше и больше памяти, а также вызывает некоторое отставание).

Я добавить UIScrollView к моей главной ViewController так:

myScrollView = [[CoreTextTestUIView alloc] init]; 
myScrollView.parentView = self; 
if(FACING == @"PU" || FACING == @"PD") 
{ 
    myScrollView.frame = CGRectMake(0,50,768,974); 
} 
else 
{ 
    myScrollView.frame = CGRectMake(0,50,1024,718); 
} 
[myScrollView setContentMode:UIViewContentModeRedraw]; 
[container addSubview:myScrollView]; 

Опять же, я хочу DrawRect называться, когда IPad вращается, так что число столбцов может измениться ... но я не хотите, чтобы он вызывал drawRect, когда я просто пытаюсь прокрутить UIScrollView.

Может кто-нибудь помочь мне, пожалуйста?

...

ниже является .m для моего UIScrollView:

#import "CoreTextTestUIView.h" 
#import <CoreText/CoreText.h> 

@implementation CoreTextTestUIView 

@synthesize parentView; 


NSMutableString *testText; 



-(id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if(self) 
    { 
     // Initialization code 

     //set BG color 
     self.backgroundColor = [[UIColor alloc] initWithRed:134 green:166 blue:228 alpha:1.0]; 

     //UIScrollView Stuff 
     //self.delegate = self; 
     self.scrollEnabled = YES; 
     self.pagingEnabled = YES; 
     self.userInteractionEnabled = YES; 
     [self becomeFirstResponder]; 
     self.showsVerticalScrollIndicator = NO; 
     self.showsHorizontalScrollIndicator = NO; 
     self.bounces = NO; 
     self.alwaysBounceHorizontal = YES; 
     self.alwaysBounceVertical = NO; 

     //generate long text 
     testText = [[NSMutableString alloc] initWithString:@""]; 
     for(int i = 100; i < 1000; i++) 
     { 
      [testText appendString:[NSString stringWithFormat:@"%i ",i]]; 
     } 

     self.alpha = 0.0; 
     [self fadeIn]; 
    } 
    return self; 
} 



-(void)fadeIn 
{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationDelegate:self]; 
    //[UIView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)]; 
    self.alpha = 1.0; 
    [UIView commitAnimations]; 
} 



// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
-(void)drawRect:(CGRect)rect 
{ 

    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@",testText]]; 

    //set font 
    CTFontRef helvetica = CTFontCreateWithName(CFSTR("Helvetica"), 40.0, NULL); 
    [string addAttribute:(id)kCTFontAttributeName 
        value:(id)helvetica 
        range:NSMakeRange(0, [string length])]; 


    //layout master 
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string); 

    //flip the coordinate system 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetTextMatrix(context, CGAffineTransformIdentity); 
    CGContextTranslateCTM(context, 0, self.bounds.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    int textPos = 0; 
    int columnIndex = 0; 

    //how many columns? (orientation dependent) 
    float howManyColumns; 
    if(parentView.FACING == @"PU" || parentView.FACING == @"PD") 
    { 
     howManyColumns = 1.0; 
    } 
    else 
    { 
     howManyColumns = 2.0; 
    } 

    //create columns in loop 
    while(textPos < [string length]) 
    { 
     NSLog(@"column started"); 

     //column form 
     CGMutablePathRef columnPath = CGPathCreateMutable(); 
     CGPathAddRect(columnPath, NULL, 
         CGRectMake((self.bounds.size.width/howManyColumns*columnIndex), 0, 
           (self.bounds.size.width/howManyColumns), 
           self.bounds.size.height)); 

     //column frame 
     CTFrameRef columnFrame = CTFramesetterCreateFrame(framesetter, 
                  CFRangeMake(textPos, 0), 
                  columnPath, 
                  NULL); 

     //use the column path 
     CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(textPos, 0), columnPath, NULL); 
     CFRange frameRange = CTFrameGetVisibleStringRange(frame); 

     //draw 
     CTFrameDraw(columnFrame, context); 

     //cleanup 
     CFRelease(columnFrame); 
     CGPathRelease(columnPath); 

     textPos += frameRange.length; 
     columnIndex++; 
    } 

    //set scrollView content size 
    int totalPages = (columnIndex+1)/howManyColumns; 
    self.contentSize = CGSizeMake(totalPages*self.bounds.size.width, self.frame.size.height); 

    //release 
    CFRelease(framesetter); 
    [string release]; 
} 



-(void)dealloc 
{ 
    [super dealloc]; 

    [parentView release]; 
    [testText release]; 
} 


@end 

ответ

2

Глядя на это, я не вижу, где вы устанавливаете contentSize вашего scrollView. Если вы не установите contentSize вашего scrollView, прокрутка не будет включена, и вы увидите только то, что подходит в текущей области scrollView. Кроме того, если ваш текст статичен в конфигурации, попробуйте оптимизировать часть перерисовки, которая происходит, и добавьте ее в подпрограмму scrollView.

+0

Я включил вызов setContentSize глубоко внутри метода drawRect ... но решение заключалось в том, чтобы нарисовать весь текст в UIView, а затем включить весь вид внутри UIScrollView (как предложил @heckman) !!! Спасибо за комплект! –

+0

@Chris Allinson Если ваш setContentSize был встроен в этот метод drawRect, вполне вероятно, что именно поэтому вы смогли прокрутить после того, как вы выполнили [myScrollView setContentMode:UIViewContentModeRedraw]; heckman

+0

Спасибо за вашу помощь: D –

1

Вот как работает DrawRect. Он называется каждый раз, когда представление перемещается или изменяется или что-то перекрывает его. Если вы правильно управляете памятью, это не должно быть проблемой.

+0

ОК, я посмотрю, чтобы все было выпущено ... спасибо –

Смежные вопросы