【问题标题】:Buttons displaced/distorted when hiding the navigation bar (After Rotation)隐藏导航栏时按钮移位/扭曲(旋转后)
【发布时间】:2012-04-19 11:26:27
【问题描述】:

我的应用程序有两个与 NavigationController 链接的 ViewController。第一个 NavigationController 有一个带有按钮的视图和一个带有标签的视图。这个视图是一个圆形的旋转菜单,它代表我的主页。视图可以在 touchesMoved 上使用 CGAffineTransformMakeRotation - QuartzCore(显然是导致问题)旋转:。

我只想在这个视图中隐藏 NavigationBar,所以我在 ViewWillAppear 上使用了 setNavigationBarHidden:YES。然后在 ViewWillDisappear 上显示该栏。

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

  1. 我尝试通过添加 [self.view setBounds:[[UIScreen] 来解决此问题 mainScreen]bounds]]; *[self.view setFrame:[[UIScreen mainScreen]bounds]];* 在 ViewDidLoad 方法或 ViweWillAppear 中, 问题仍然存在。
  2. 我尝试在 ViewWillAppear 中将 NavigationBar alpha 设置为 0 并设置 它在 ViewWillDisappear 上设置为 1,我试过了 self.navigationController.navigationBar.translucent = YES 选项没有解决问题。
  3. 我尝试以编程方式设置视图、按钮和标签位置 ViewWillAppear 并没有解决问题。
  4. 我怀疑动画,所以我删除了它,但它对问题没有任何影响。

作为初学者我无法解决这个问题,请帮助!

ViewController.h(第一个 ViewController)

#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];
 }

【问题讨论】:

  • 我注意到,当从第一个 ViewController 转换到第二个时,第一个视图会拉伸(显然 NavigationBar 正在挤压视图)!它仍然被挤压!......知道如何避免这种情况吗?每次我去第二个 ViewController 并回到第一个时,它都会挤压更多......

标签: ios5 rotation uinavigationbar quartz-core


【解决方案1】:

是的,我发现了问题……当 NavigationController 是否隐藏时,主视图的自动调整大小会挤压我的子视图。所以我添加了 self.view.autoresizesSubviews = NO;到 ViewDidLoad,问题就解决了。

【讨论】:

  • 你不知道我对这个答案有多感激。这也可以在属性检查器下的界面构建器中完成。只需取消选中“自动调整子视图大小”框即可。
猜你喜欢
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 2012-04-21
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多