Во-первых, никогда не меняйте интерфейс вне основного потока.Таким образом, вы должны изменить ваш код на что-то вроде:
dispatch_async(drawingQue, ^{
// ...
dispatch_async(dispatch_get_main_queue(), ^{
button.frame= CGRectMake(x+y, x-y, a, b);
[button setTitle:@"abc"];
});
});
Во-вторых, никогда не меняйте интерфейс внутри метода shouldAutorotateToInterfaceOrientation
.Все, что вам нужно сделать внутри этого метода, это вернуть, должно ли представление вращаться или нет.Например, в некоторых случаях, когда у вас есть иерархия контроллера представления, представление может не поворачиваться, даже если вы вернете YES
в shouldAutorotateToInterfaceOrientation
.
Итак, вы должны вызвать свой код внутри метода:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
Этого можно достичь разными способами.Самый простой (и тот, который я рекомендую) - использовать стандартный метод Objective-C:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) { // landscape
[self rotateButtonWithA:234 b:24];
} else { // portrait
[self rotateButtonWithA:123 b:24];
}
}
- (void)rotateButtonWithA:(CGFloat)a b:(CGFloat)b
{
dispatch_async(drawingQue, ^{
// ...
dispatch_async(dispatch_get_main_queue(), ^{
button.frame= CGRectMake(x+y, x-y, a, b);
[button setTitle:@"abc"];
});
});
}
Вам не нужно вызывать сам блок из нескольких мест.Но если вы все еще хотите это сделать, здесь есть много ответов, которые покажут вам, как это сделать.