隐藏导航栏时位移/扭曲的按钮(旋转后)

问题描述:

我的应用程序有两个ViewController与NavigationController链接。第一个NavigationController有一个带按钮的视图和一个带标签的视图。这个视图是一个循环旋转菜单,它代表了我的主页。视图可以随CGAffineTransformMakeRotation旋转 - QuartzCore(显然这是造成问题)在touchesMoved :.隐藏导航栏时位移/扭曲的按钮(旋转后)

我想隐藏导航栏只有在这种观点,所以我用setNavigationBarHidden:YESviewWillAppear中。然后在ViewWillDisappear上显示吧。

在模拟器上,一切按预期工作,直到我旋转第一个ViewController,当我旋转然后点击任何按钮(转到第二个ViewController)然后点击返回(回到我的第一个ViewController),一切都会是distorted

  1. 我试图通过添加来解决该问题[self.view的setBounds:[[UIScreen mainScreen]界限]]; * [self.view SETFRAME:[[UIScreen mainScreen]界限]]; *在viewDidLoad中方法或ViweWillAppear, 问题仍然存在。
  2. 我试图导航栏阿尔法在viewWillAppear中设置为0和设置 它1 ViewWillDisappear,我试图 self.navigationController.navigationBar.translucent = YES都 选项并没有解决问题。
  3. 我试图以编程方式设置视图,按钮和标签的位置 in ViewWillAppear并且它不能解决问题。
  4. 我怀疑动画,所以我删除它,但它对问题没有任何影响。

作为初学者,我无法解决此问题,请帮忙!

ViewController.h(第一视图控制器)

#import <UIKit/UIKit.h> 
#import <QuartzCore/QuartzCore.h> 

@interface ViewController : UIViewController 

@property (nonatomic, strong) IBOutlet UIView *aView; 
@property (nonatomic, strong) IBOutlet UIView *bView; 

@property (nonatomic, strong) IBOutlet UIButton *bimg1; 
… 
@property (strong, nonatomic) IBOutlet UILabel *label1; 
… 
-(void) rotateTo:(CGFloat)x andY:(CGFloat)y; 

@end 

ViewController.m

#import "ViewController.h" 

@implementation ViewController 
@synthesize aView = _aView; 
… 
@synthesize bimg1 = _bimg1; 
… 
@synthesize label1 = _label1; 
… 

static inline double toradians (double degrees) { 
return degrees * M_PI/180; 
} 

-(void)viewDidLoad { 
    ![enter image description here][1][super viewDidLoad]; 
    //Set text font 
    [_label1 setFont:[UIFont fontWithName:@"Consolas" size:16]]; 
… 
    [self.view setBounds:[[UIScreen mainScreen]bounds]]; 
    [self.view setFrame:[[UIScreen mainScreen]bounds]]; 
} 

-(void)viewWillAppear:(BOOL)animated { 
    self.navigationController.navigationBar.hidden = YES; 
    printf("Aview x: %f  | Aview y: %f \n",self.aView.frame.origin.x, self.aView.frame.origin.y); 
    printf("Aview width: %f | Aview height: %f \n",self.aView.frame.size.width, self.aView.frame.size.height); 
} 

-(void)viewWillDisappear:(BOOL)animated { 
    self.navigationController.navigationBar.hidden = NO; 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint LastTouchPoint = [touch locationInView:self.view]; 
    CGFloat LasTouchx = LastTouchPoint.x; 
    CGFloat LasTouchy = LastTouchPoint.y; 

    CGPoint CenterPoint = self.view.center; 
    CGFloat x = LasTouchx - CenterPoint.x; 
    [self rotateTo:x andY:y]; 
} 

-(void) rotateTo:(CGFloat)x andY:(CGFloat)y { 
    CGFloat angle = x/y; 
    angle = atan(angle); 
    angle = angle * 360/M_PI; 
    angle *= 0.0174532925; 

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    [UIView setAnimationDuration:1]; 
    self.aView.transform=CGAffineTransformMakeRotation(-angle); 
    self.bView.transform=CGAffineTransformMakeRotation(-angle); 

    self.bimg1.transform=CGAffineTransformMakeRotation(angle); 
    self.bimg2.transform=CGAffineTransformMakeRotation(angle); 
    self.bimg3.transform=CGAffineTransformMakeRotation(angle); 
    self.bimg4.transform=CGAffineTransformMakeRotation(angle); 

    self.label1.transform=CGAffineTransformMakeRotation(angle); 
    self.label2.transform=CGAffineTransformMakeRotation(angle); 
    self.label3.transform=CGAffineTransformMakeRotation(angle); 
    self.label4.transform=CGAffineTransformMakeRotation(angle); 
    [UIView commitAnimations]; 
} 

- (void)viewDidUnload 
{ 
    [self setBimg1:nil]; 
    … 
    [self setAView:nil]; 
    [self setBView:nil]; 
    [super viewDidUnload]; 
} 
+0

我注意到,虽然从第一个ViewController翻译到第二个,第一个视图延伸(显然NavigationBar是挤压视图)!它仍然被挤压!...任何想法如何避免这种情况?每次我去第二个ViewController并回到第一个时,它会挤压更多... – 2012-04-19 14:32:11

是啊,我想通了这个问题...主视图的自动调整大小正挤压着我的子视图当NavigationController被隐藏或没有。所以我加了self.view.autoresizesSubviews = NO;以ViewDidLoad和问题已修复。

+0

你不知道我是多么感激这个答案。这也可以在属性检查器下的界面生成器中完成。只需取消选中“Autoresize子视图”框。 – David 2013-07-11 21:35:21