2015-11-03 3 views
0

У меня есть GameOver UIView, который я вызываю изнутри моего основного UIViewController. Это просто окно «popover», в котором есть текстовая игра, оценка и некоторые эффекты размытия, чтобы размыть основной UIViewcontroller.UIView не принимает данные UIViewControllers

Я пытаюсь передать int в UIView, но он не принимает его, если он не находится в методе - (void)drawRect:(CGRect)rect.

Если я перемещаю метку оценки в метод drawRect, метка обновляется. Но эффект размытия исчезает.

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

MainViewController.m

#import "GameOverView.h" 

@interface ViewController() { 
    GameOverView * gov; 
} 

- (void) showGameOver { 
    gov = [[GameOverView alloc] initWithFrame:self.view.bounds]; 
    NSLog(@"Passing score of: %i", self.score); 
    gov.finalScore = self.score; 
    [self.view addSubview:gov]; 
} 

GameOverView.h

@interface GameOverView : UIView {} 
@property (nonatomic) int finalScore; 
@end 

GameOverView.M

@implementation GameOverView 
- (id) initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     //self.backgroundColor = [UIColor redColor]; 

     NSLog(@"Score:%i", self.finalScore ); 

     UIVisualEffect *blurEffect; 
     blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; 

     UIVisualEffectView *visualEffectView; 
     visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; 
     visualEffectView.frame = super.bounds; 
     [super addSubview:visualEffectView]; 

     UILabel * lblGameOver = [[UILabel alloc] initWithFrame:CGRectMake(0,0, frame.size.width, 200)]; 
     lblGameOver.center = CGPointMake(frame.size.width/2, 100); 
     lblGameOver.text = [NSString stringWithFormat: @"GAME OVER %i", self.finalScore]; 
     [self addSubview:lblGameOver]; 

     UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, 200)]; 
     button.center = CGPointMake(frame.size.width/2, 200); 
     [button setTitle:@"Start New Game" forState:UIControlStateNormal]; 
     [button addTarget:self action:@selector(removeSelfFromSuperview) forControlEvents:UIControlEventTouchUpInside]; 
     [self addSubview:button]; 

    } 
    return self; 
} 
- (void) removeSelfFromSuperview{ 
    [self removeFromSuperview]; 
} 
+0

У вас возникли проблемы с цветом фона представления? –

ответ

1

Вы используете finalScore в методе init метода GameOverView, но вы только устанавливаете его значение после его инициализации.

Измените метод инициализации

- (id) initWithFrame:(CGRect)frame finalScore:(int)fs{ 
     // use 'fs' instead of 'self.finalScore' 
    } 

Он должен работать.

+0

Я закончил это. Переопределение initWithFrame. –

1

Интересно, как нет проблем с цветом фона представления. Вы инициализация вида и добавить его как подвид, как это:

gov = [[GameOverView alloc] initWithFrame:self.view.bounds]; 
gov.finalScore = self.score; 
[self.view addSubview:gov]; 

Это даст цвет фона вида как черные, который по умолчанию цвета. Таким образом, вы не найдете большой разницы, если вы используете эффект размытия.

вы должны дать цвет для представления во время инициализации:

 gov = [[GameOverView alloc] initWithFrame:self.view.bounds]; 
[gov setBackgroundColor:[UIColor yourColor]]; 
[self.view addSubview:gov]; 

Если вы планируете сохранить код в initWithFrame, вам не нужно беспокоиться о настройке цвета фона. Если вы сохраняете код в drawRect, тогда вы должны установить цвет фона, иначе он будет черного цвета.

При приближении к установке метки оценки не имеет значения, поместили ли вы его в метод drawRect или initWithFrame. Убедитесь, что вы используете метод drawRect, только если вам действительно нужно нарисовать его на вид, чтобы вы могли его называть позже, используя setNeedsDisplay