2013-11-02 3 views
2

Я пытаюсь добавить строку к представлению с помощью метода drawAtPoint:point withAttributes:attrs, но строка не должна быть замечена нигде внутри представления, или, по крайней мере, я не могу ее увидеть (это может быть, что цвет такой же, как вид, белый).drawAtPoint не отображает текст в представлении

Следующий код является то, что я использую в viewDidLoad моего зрения контроллера:

NSMutableDictionary *stringAttributes = [[NSMutableDictionary alloc] init]; 


[stringAttributes setObject:[UIColor redColor]forKey: NSForegroundColorAttributeName]; 


NSString *someString = [NSString stringWithFormat:@"%@", @"S"]; 

[someString drawAtPoint:CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2) withAttributes: stringAttributes]; 

Что это такое, что я делаю неправильно?

EDIT: После того, как следующие предложения @ rokjarc, я создал контроллер с drawRect метод, который добавляет строку в текущем контексте просмотра:

#import <Foundation/Foundation.h> 


@interface XYZSomeView : UIView 
@end 

#import "XYZSomeView.h" 
#import "NSString+NSStringAdditions.h" 


@implementation XYZSomeView 

- (void)drawRect:(CGRect)rect { 

    [super drawRect:rect]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 

    NSMutableDictionary *stringAttributes = [[NSMutableDictionary alloc] init]; 


    [stringAttributes setObject:[UIColor redColor]forKey: NSForegroundColorAttributeName]; 


    NSString *someString = [NSString stringWithFormat:@"%@", @"S"]; 

    [someString drawAtPoint:CGPointMake(rect.origin.x, rect.origin.y) withAttributes: stringAttributes]; 

    NSLog(@"%@", someString); 

    CGContextRestoreGState(context); 
} 

@end 

И внутри мой взгляд, корень контроллера я инициализировать XYZSomeView :

#import "XYZRootViewController.h" 
#import "XYZSomeView.h" 


@implementation XYZRootViewController 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.view.backgroundColor = [UIColor whiteColor]; 



    XYZSomeView *someView = [[XYZSomeView alloc] init]; 

    [self.view addSubview:someView]; 

} 
- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 

    NSLog(@"%@", @"XYZRootViewController reveived memory warning"); 
} 
@end 

вопрос заключается в том, что мой drawRect не называют, потому что я должен назвать это сам? Я думал, что этот метод следует вызвать при инициализации без необходимости называть его.

+0

Попробуйте переместить его в 'viewWillAppear', поскольку макет представлений не будет завершен во время' viewDidLoad', поэтому метод 'CGPointMake' может не возвращать ожидаемое местоположение. – bobnoble

+0

@rolandjitsu: Вы должны установить некоторый фрейм в someView. Для начала это может быть так же просто, как 'someView.frame = self.view.bounds;' И я бы согласился на '[super drawRect: rect];' Также попробуйте установить некоторые фиксированные координаты для первых попыток - рисунок в начале координат прямой - это не очень хорошая идея, поскольку теоретически прямой может быть чем угодно - он дает вам область зрения, которую нужно перерисовать. –

+0

Итак, я должен использовать 'initWithFrame' вместо' init'. Я забыл, что 'XYZSomeView' не является подклассом' UIViewController'. Не могли бы вы объяснить, почему я не должен называть супер 'drawRect'? Я читал, что это хорошо, когда вы называете супер методы, прежде чем начинать с моей собственной, но, возможно, я ошибаюсь, так как я новичок в этом. – Roland

ответ

2

Для использования этой функции вам понадобится ссылка на текущий графический контекст, чтобы использовать эту функцию: docs. У вас нет этой ссылки в пределах viewDidLoad:. Обычно это делается в пределах drawRect:. Есть способы использовать его при создании контента вне экрана - но это, похоже, не соответствует вашим потребностям.

Если вы хотите добавить простой текст в контроллер вида в своем 'viewDidLoad, рассмотрите возможность добавления простого UILabel с прозрачным фоном для просмотра этого контроллера вида.

+0

Обычно я использую метки, но в этом случае я изучаю, как использовать категории и как расширить существующие рамки новыми методами. Я пытаюсь добавить методы drawAtPoint, которые перехватывают строку перед добавлением ее в представление. Это единственная причина, почему я так делаю. – Roland

+0

Ага. Для учебного случая вы можете попробовать подклассифицировать 'UIView' и переопределить его метод' drawRect'. –

+0

Один хороший пример того, как этого достичь: http: // stackoverflow.com/a/10293425/653513 –

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