2015-06-03 4 views
1

Мне нужно добавить дополнительные UIWindow в мое приложение. Это UIWindow всегда должен быть расположен в правом нижнем углу экрана, несмотря на ориентацию устройства, вот эскиз: enter image description hereПозиционирование UIWindow в UIScreen в iOS

Я попытался подкласс UIWindow так, чтобы иметь возможность установить размер и допустимые пределы окна:

@interface MyWindow : UIWindow 

@property (nonatomic) CGSize size; 
@property (nonatomic) CGFloat margin; 

@end 

@implementation MyWindow 

- (id)initWithSize:(CGSize)size andMargin:(CGFloat)margin { 
    self.size = size; 
    self.margin = margin; 
    return [self initWithFrame:[self calculateFrame]]; 
} 

- (CGRect)calculateFrame { 
    return CGRectMake([[UIScreen mainScreen] bounds].size.width-self.size.width-self.margin, [[UIScreen mainScreen] bounds].size.height-self.size.height-self.margin, self.size.width, self.size.height); 
} 

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

-(void)assignObservers { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(statusBarDidChangeFrame:) 
               name:UIDeviceOrientationDidChangeNotification 
               object:nil]; 
} 

- (void)statusBarDidChangeFrame:(NSNotification *)notification { 
    [self setFrame:[self calculateFrame]]; 
} 

@end 

Все отлично работает при запуске! Независимо от того, какая ориентация при первоначальном запуске новая позиция UIWindow правильная. Но когда я вращаю устройство - мое окно сходит с ума, оно перескакивает на неожиданные позиции, и я не могу понять, почему.

Пожалуйста, помогите!

+0

Кто-нибудь? Пожалуйста, мне очень нужна помощь ... – oleynikd

ответ

1

Все отлично работает, если:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self setFrame:[self calculateFrame]]; 
}); 

Так полный рабочий код выглядит следующим образом:

@interface MyWindow : UIWindow 

@property (nonatomic) CGSize size; 
@property (nonatomic) CGFloat margin; 

@end 

@implementation MyWindow 

- (id)initWithSize:(CGSize)size andMargin:(CGFloat)margin { 
    self.size = size; 
    self.margin = margin; 
    return [self initWithFrame:[self calculateFrame]]; 
} 

- (CGRect)calculateFrame { 
    return CGRectMake([[UIScreen mainScreen] bounds].size.width-self.size.width-self.margin, [[UIScreen mainScreen] bounds].size.height-self.size.height-self.margin, self.size.width, self.size.height); 
} 

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

-(void)assignObservers { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(statusBarDidChangeFrame:) 
               name:UIApplicationDidChangeStatusBarOrientationNotification 
               object:nil]; 
} 

- (void)statusBarDidChangeFrame:(NSNotification *)notification { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self setFrame:[self calculateFrame]]; 
    }); 
} 

@end 

Большое спасибо Какао-чат и max.lunin :)

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