在Xcode 5.0.2中,我创建了a universal app并将UIScrollView
和UIImageView
(其“查看模式”更改为“左上角”)拖入iPhone和iPad故事板(这里fullscreen):
为了让UIScrollView
填满整个屏幕,我添加了4个约束(此处fullscreen):
然后在ViewController.m我试图:
board.png
(版权所有Wikipedia Commons,Denelson83)UIImageView
board.png
尺寸
contentSize
的{{1}}设置为相同尺寸这里是源代码:
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 - 向左箭头) - 图像滚动停止工作:
问题2:
在纵向模式下,滚动有效,但我无法到达右下角:
更新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
答案 0 :(得分:1)
很少要添加。
请勿使用bounds
,因为在轮播中框架正在更改,您需要更改值,bounds
值永远不会更改。
您的AutoLayout
设置存在问题,请尝试将其关闭。
删除用于设置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实际定义图像的大小以及相对于滚动视图的位置。如果这样做,则自动计算滚动的内容大小,即使轮换更改也不必显式处理。
答案 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)
请参阅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):
ViewController.m中的以下代码已足够(无需轮换检测):
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage *img = [UIImage imageNamed:@"board"];
_imageView.image = img;
}
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
_scrollView.contentSize = _imageView.bounds.size;
}