UIScrollView不以横向模式滚动 - 附加测试代码和屏幕截图

时间:2014-02-19 11:29:47

标签: ios iphone objective-c uiscrollview rotation

在Xcode 5.0.2中,我创建了a universal app并将UIScrollViewUIImageView(其“查看模式”更改为“左上角”)拖入iPhone和iPad故事板(这里fullscreen):

xcode screenshot

为了让UIScrollView填满整个屏幕,我添加了4个约束(此处fullscreen):

xcode screenshot

然后在ViewController.m我试图:

  1. 加载board.png(版权所有Wikipedia Commons,Denelson83)
  2. 提供与UIImageView
  3. 相同的board.png尺寸
  4. contentSize的{​​{1}}设置为相同尺寸
  5. 这里是源代码:

    UIScrollView

    这里输出:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        UIImage *img = [UIImage imageNamed:@"board"];
        NSLog(@"%s: (%f x %f)", __PRETTY_FUNCTION__, img.size.width, img.size.height);
        _imageView.image = img;
        _imageView.frame = CGRectMake(0, 0, img.size.width, img.size.height);
    }
    
    - (void)viewDidLayoutSubviews
    {
        [super viewDidLayoutSubviews];
    
        _scrollView.contentSize = _imageView.bounds.size;
    }
    
    - (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    {
        [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
    
        // fruitless attempt to solve the rotation problem
        _scrollView.contentSize = _imageView.bounds.size;
    }
    

    这种作品,但有两个问题:

    问题1:

    当我旋转iPhone或iPad模拟器时(通过按下Cmd - 向左箭头) - 图像滚动停止工作:

    iphone 3.5 screenshot

    ipad screenshot

    问题2:

    在纵向模式下,滚动有效,但我无法到达右下角:

    iphone 4 screenshot

    更新1:

    我已经尝试过iphonic的建议(谢谢!),我看到Scroll[3464:70b] -[ViewController viewDidLoad]: (1000.000000 x 961.500000) 选择器被调用,但应用程序仍然没有滚动:

    deviceOrientationDidChange

    (我正在使用Scroll[702:70b] -[ViewController viewDidLoad]: image size = {1000, 961.5} Scroll[702:70b] -[ViewController deviceOrientationDidChange:]: view size = {1000, 961.5} Scroll[702:70b] -[ViewController deviceOrientationDidChange:]: view size = {1000, 961.5} Scroll[702:70b] -[ViewController deviceOrientationDidChange:]: view size = {1000, 961.5} ,因为_imageView.image.size在我的sotryboards中被定义为100 x 100):

    _imageView.size

6 个答案:

答案 0 :(得分:1)

很少要添加。

  1. 请勿使用bounds,因为在轮播中框架正在更改,您需要更改值,bounds值永远不会更改。

  2. 您的AutoLayout设置存在问题,请尝试将其关闭。

  3. 删除用于设置contentSize的所有代码。只需使用以下代码即可。

    -(void)viewDidLoad
      {
        [super viewDidLoad];
    
        UIImage *img = [UIImage imageNamed:@"board"];
        NSLog(@"%s: (%f x %f)", __PRETTY_FUNCTION__, img.size.width, img.size.height);
        _imageView.image = img;
        _imageView.frame = CGRectMake(0, 0, img.size.width, img.size.height);
    
        //Handles rotation notifications
        [[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object: nil]; 
    }
    
    
    
    -(void)deviceOrientationDidChange:(NSNotification *)notification
    
    {
        _scrollView.contentSize = _imageView.frame.size;
    
        NSLog(@"Size = %@",NSStringFromCGSize(_imageView.frame.size));
    }
    

答案 1 :(得分:1)

这就是我将图像滚动的方式。

  1. 将滚动视图的边缘固定到父视图。
  2. 将图像边缘固定到滚动视图。
  3. 明确设置图像的宽度和高度约束。
  4. 构建并运行。
  5. 使用步骤1,您可以相对于屏幕定位滚动视图,然后使用步骤2和3实际定义图像的大小以及相对于滚动视图的位置。如果这样做,则自动计算滚动的内容大小,即使轮换更改也不必显式处理。

答案 2 :(得分:1)

在源代码中启用自动布局。在动态imageView大小的情况下,我不太了解设置约束但是如果你想在没有约束的情况下这样做,那么在Mainstoryboard中关闭Autolayout。并通过此修改以下方法,

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    UIImage *img = [UIImage imageNamed:@"board"];
    NSLog(@"%s: (%f x %f)", __PRETTY_FUNCTION__, img.size.width, img.size.height);
    _imageView.image = img;
    _imageView.frame = CGRectMake(0, 0, img.size.width, img.size.height);

    _scrollView.contentSize = _imageView.bounds.size;
}

答案 3 :(得分:1)

由于您要在故事板中实例化图像视图,因此无论您在代码中执行什么操作,其布局都由自动布局决定。因此,在代码中设置图像视图的框架不会产生任何效果。

虽然你没有明确地为图像视图配置任何约束(据我所知),Xcode已经安装了隐式约束。这些限制可能不是你想要的。

此外,您无法明确设置滚动视图的contentSize。相反,contentSize由图像视图的大小自动确定。

您可能希望在继续之前查看Apple的技术说明:https://developer.apple.com/library/ios/technotes/tn2154/_index.html

答案 4 :(得分:1)

  1. 删除Orientation和viewDidLayoutSubviews
  2. 的代码
  3. 在viewDidLoad方法
  4. 中提及UIScrollView contentSize
  5. 在“绘图”部分和“检查剪辑子视图”下的XIB中取消选中UIScrollView的AutoResizeSubview = NO。
  6. 请参阅https://github.com/jayaprada-behera/ScrollViewOrientation

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        //set uiscrollview.autoresizeSubview = NO; in xib
        UIImage *img = [UIImage imageNamed:@"board.png"];
        imageView_.image = img;
    
        imageView_.frame = CGRectMake(imageScrollView.frame.origin.x, imageScrollView.frame.origin.y, img.size.width, img.size.height);
        imageScrollView.contentSize = imageView_.bounds.size;
    }
    

    它会起作用。

答案 5 :(得分:0)

我自己的解决方案:

在Interface Builder中,我已为UIImageView指定了宽度和高度,并将其“查看模式”设置为“底部”(此处为fullscreen):

Xcode screenshot

ViewController.m中的以下代码已足够(无需轮换检测):

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIImage *img = [UIImage imageNamed:@"board"];
    _imageView.image = img;
}

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    _scrollView.contentSize = _imageView.bounds.size;
}