7
votes

Simple UIView Drawrect non appelé

Je ne peux pas comprendre ce que le problème est ici. J'ai une très simple UIViewController avec une méthode de la vue ViewDidDidLoad très simple: xxx pré>

et mon gameview est initialisé comme suit: p> xxx pré>

et il est simplement A une nouvelle méthode Drawrect: P>

- (void)drawRect:(CGRect)rect
{

    [super drawRect:rect];

    NSLog(@"drawing");
}


1 commentaires

Ajouter [Self.View BringSubviewToFront: v]; au ViewDidLoad et voyez si cela fait une différence.


4 Réponses :


12
votes

Avez-vous essayé de spécifier le cadre dans l'initialisation de la vue? Parce que vous créez une uIView personnalisée, vous devez spécifier le cadre pour la vue avant que la méthode de dessin soit appelée.

Essayez de changer votre viewDidLoad sur les éléments suivants: P>

NSLog(@"making game view");
GameView *v = [[GameView alloc] initWithFrame:CGRectMake(0,0,320,460)];


if (v == nil)
    NSLog(@"was not allocated and/or initialized");

[self.view addSubview:v];

if (v.superview == nil)
    NSLog(@"was not added to view");

[super viewDidLoad];


4 commentaires

Comment puis-je remplacer la méthode init pour faire cela? Quelle est la méthode appropriée en direction de cela?


J'ai essayé de le faire comme ceci: Gameview * v = [[Gameview ALLOC] InitwithFrame: CGrectument (0,0,320,460)]; mais ça n'a toujours pas fonctionné


Avez-vous fait des autres personnalisations?


Merci pour ce @eytan. Quelque chose arrive lorsque vous appelez [super initwithframe: ...] qui active drawrect . Je remplace une déclaration init et je fixais le cadre là-bas. Si j'ai changé le self = [Super init] sur auto = [Super InitwithPrame: CGrectument (1,1,1,1)] , cela fonctionnerait. Maintenant, je viens de remplacer initwithframe pour le rendre plus transparent.



0
votes

Vérifiez si votre vue est affichée. Si une vue n'est pas actuellement à l'écran, Drawrect ne sera pas appelé même si vous ajoutez la vue à son superview. Une possibilité est que votre vue soit bloquée par la même autre vue.

Et autant que je sache, vous n'avez pas besoin d'écrire [super drawrect] ;

Notez que même si ViewDidLoad est appelé sur un contrôleur d'affichage, il n'indique pas nécessairement que la vue du contrôleur d'affichage est affichée à l'écran. Exemple: supposez qu'un contrôleur d'affichage A a un ivar où un contrôleur de vue B est stocké et afficher la vue de contrôleur A est actuellement affiché. Supposons également que B est allocé et inité. Maintenant, si une méthode d'une vision de B de B est accessible ViewDidLoad dans B sera appelée en conséquence, que ce soit affiché.


0 commentaires

0
votes

Si vous utilisez une LIB ou un fichier Cocoatsouch, vous devrez peut-être remplacer la méthode InitwithCoder au lieu de la vue ViewDidLoad.

objectif-c: xxx


0 commentaires

0
votes

J'ai eu une opinion qui était décrénale, que je chargerais à l'écran, puis redessinez. Toutefois, tout en nettoyant les contraintes de mise en page automatique en Xcode, elle a décidé que ma vue offcrine devrait avoir une image (0,0,0,0) (x, y, w, h). Et avec une taille (0,0), la vue ne chargerait jamais.

Assurez-vous que votre nsview a une taille de cadre non zéro ou que le drawrect ne sera pas appelé.


0 commentaires