在横向方向上,图像定位不正确

时间:2012-05-26 11:05:36

标签: iphone ios ios4 orientation

请查看以下代码,当我将模拟器旋转到横向时,图像定位不正确。但在肖像画中似乎很好。

我的图像尺寸是高度768,宽度是1024.即使我已经相应地设置了框架。

我不确定这背后的原因是什么。

请告诉我代码中的问题。

const CGFloat HEIGHT = 1024.0;
const CGFloat WIDTH = 768.0;
#define myViewPortrait CGRectMake(0.0f, 0.0f, 768.0f,1024.0f)
#define myViewLandSacpe CGRectMake(0.0f, 0.0f, 1024.0f,768.0f)

#define kAnimationKey @"animationKey"


-(void)layoutScrollImages
{
  UIImageView *view = nil;
  NSArray *subviews = [myScrollView subviews];

  CGFloat curXLoc = 0;
  for (view in subviews)
  {
    if ([view isKindOfClass:[UIImageView class]] && view.tag > 0)
    {
      CGRect frame = view.frame;
      frame.origin = CGPointMake(curXLoc, 0);
      view.frame = frame;

      curXLoc += (self.view.frame.size.width);
    }
  }

  [myScrollView setContentSize:CGSizeMake((myImagesCount * self.view.frame.size.width), [myScrollView bounds].size.height)];
}   


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {

  self.view.backgroundColor = [UIColor viewFlipsideBackgroundColor];
  myScrollView = [[UIScrollView alloc] initWithFrame:
  CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

  [self.view addSubview:myScrollView];

  UISwipeGestureRecognizer *rightRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(rightSwipeHandle:)];
  rightRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
  rightRecognizer.numberOfTouchesRequired = 1;
  [rightRecognizer setDelegate:self];
  [myScrollView addGestureRecognizer:rightRecognizer];
  [rightRecognizer release];

  UISwipeGestureRecognizer *leftRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(leftSwipeHandle:)];
  leftRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
  leftRecognizer.numberOfTouchesRequired = 1;
  [leftRecognizer setDelegate:self];
  [myScrollView addGestureRecognizer:leftRecognizer];
  [leftRecognizer release];

  [myScrollView setBackgroundColor:[UIColor blackColor]];
  [myScrollView setCanCancelContentTouches:NO];
  myScrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
  myScrollView.clipsToBounds = YES;     
  myScrollView.scrollEnabled = YES;
  myScrollView.pagingEnabled = YES;
  myScrollView.delegate = self;
  myImagesCount = 5;
  myScrollView.showsHorizontalScrollIndicator=NO;
  myScrollView.showsVerticalScrollIndicator=NO;

  for (int i = 1; i <= myImagesCount; i++)
  {
    NSString *imageName = [NSString stringWithFormat:@"screen-%d.jpg", i];
    UIImage *image = [UIImage imageNamed:imageName];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

    CGRect rect = imageView.frame;
    rect.size.height = myScrollView.frame.size.height;
      NSLog(@"%d -----",self.view.frame.size.width);
    rect.size.width = myScrollView.frame.size.width;
    imageView.frame = rect;
    imageView.tag = i;
    [myScrollView addSubview:imageView];
    [imageView release];
  }

  [self layoutScrollImages];

  [super viewDidLoad];

}

// if you want to change things based on orientation
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation duration:(NSTimeInterval)duration 
{
    switch (interfaceOrientation) 
    {
        case UIInterfaceOrientationPortrait:
        {       
            //changes for Portait
            NSLog(@"Portait");
            [self.view setFrame:CGRectMake(0,0,768,1024)];
            myScrollView.frame = self.view.frame;
        }
            break;

        case UIInterfaceOrientationPortraitUpsideDown: 
        {
            //changes for PortaitUpsideDown
            NSLog(@"PortaitUpsideDown");
            [self.view setFrame:CGRectMake(0,0,768,1024)];
            myScrollView.frame = self.view.frame;

        }
            break;


        case UIInterfaceOrientationLandscapeRight: 
        {
            //changes for LandscapeRight
            NSLog(@"LandscapeRight");
            [self.view setFrame:CGRectMake(0,0,1024,768)];
            myScrollView.frame = self.view.frame;


        }
            break;

        case UIInterfaceOrientationLandscapeLeft: 
        {
            //changes for LandscapeRight
            NSLog(@"LandscapeRight");
            [self.view setFrame:CGRectMake(0,0,1024,768)];
            myScrollView.frame = self.view.frame;

        }
            break;          
    }
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

- (void)rightSwipeHandle:(UISwipeGestureRecognizer*)gestureRecognizer 
{
  CATransition *animation = [CATransition animation];
  [animation setDelegate:self];
  [animation setType:kCATransitionFade];
  [animation setSubtype:kCATransitionFromRight];
  [animation setDuration:1.0];
  [animation setTimingFunction:[CAMediaTimingFunction functionWithName:
   kCAMediaTimingFunctionEaseInEaseOut]];
  [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
  [[self.view layer] addAnimation:animation forKey:kAnimationKey];  

}

- (void)leftSwipeHandle:(UISwipeGestureRecognizer*)gestureRecognizer 
{
    CATransition *animation = [CATransition animation];
    [animation setDelegate:self];
    [animation setType:kCATransitionFade];
    [animation setSubtype:kCATransitionFromLeft];
    [animation setDuration:1.0];
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:
                                  kCAMediaTimingFunctionEaseInEaseOut]];
    [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
    [[self.view layer] addAnimation:animation forKey:kAnimationKey];  
}



// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    return YES;
}
  

编辑:由于我现在无法提交评论,因此在调试时它正在进行中   所有willrotate的案例

1 个答案:

答案 0 :(得分:1)

将您的代码写在- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation而不是- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation duration:(NSTimeInterval)duration中并在其中实施。我认为这将是有效的。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        //return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
        if ((interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight)) {
           //implement your code 
        return (interfaceOrientation != UIInterfaceOrientationLandscapeRight);
    } else {

        return YES;
    }
}