启用页面并更改设备旋转/方向的 UIScrollView(疯狂)
我很难把这件事做好。
我有一个 UIScrollView,启用了分页。它由视图控制器(MainViewController)管理,每个页面由 PageViewController 管理,其视图在适当的偏移处添加为滚动视图的子视图。对于标准方向的 iPhone 应用程序,滚动方向为左右滚动。效果很好。基本上和Apple提供的示例一模一样,也和iPhone附带的天气应用程序一样。
然而,当我尝试支持其他方向时,事情却不太顺利。我用这种方法支持 MainViewController 和 PageViewController 中的每个方向:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
但是,当我旋转设备时,我的页面变得相当倾斜,并且存在很多绘图故障,特别是如果只加载了部分页面,那么我旋转,然后滚动更多,等等......非常混乱。
我已经告诉我的观点支持自动调整大小
theView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
但无济于事。它似乎只是延伸和扭曲了我的观点。
在我的 MainViewController 中,我添加了这一行,试图调整所有页面视图的大小:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * ([self.viewControllers count]), self.scrollView.frame.size.height);
for (int i = 0; i < [self.viewControllers count]; i++) {
PageViewController *controller = [self.viewControllers objectAtIndex:i];
if ((NSNull *)controller == [NSNull null])
continue;
NSLog(@"Changing frame: %d", i);
CGRect frame = self.scrollView.frame;
frame.origin.x = frame.size.width * i;
frame.origin.y = 0;
controller.view.frame = frame;
}
}
但它并没有太大帮助(因为我延迟加载视图,因此执行时不一定会加载所有视图)。
有什么办法可以解决这个问题吗?
I'm having a hard time getting this right.
I've got a UIScrollView, with paging enabled. It is managed by a view controller (MainViewController) and each page is managed by a PageViewController, its view added as a subview of the scrollView at the proper offset. Scrolling is left-right, for standard orientation iPhone app. Works well. Basically exactly like the sample provided by Apple and also like the Weather app provided with the iPhone.
However, when I try to support other orientations, things don't work very well. I've supported every orientation in both MainViewController and PageViewController with this method:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
However, when I rotate the device, my pages become quite skewed, and there are lots of drawing glitches, especially if only some of the pages have been loaded, then I rotate, then scroll more, etc... Very messy.
I've told my views to support auto-resizing with
theView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
But to no avail. It seems to just stretch and distort my views.
In my MainViewController, I added this line in an attempt to resize all my pages' views:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * ([self.viewControllers count]), self.scrollView.frame.size.height);
for (int i = 0; i < [self.viewControllers count]; i++) {
PageViewController *controller = [self.viewControllers objectAtIndex:i];
if ((NSNull *)controller == [NSNull null])
continue;
NSLog(@"Changing frame: %d", i);
CGRect frame = self.scrollView.frame;
frame.origin.x = frame.size.width * i;
frame.origin.y = 0;
controller.view.frame = frame;
}
}
But it didn't help too much (because I lazily load the views, so not all of them are necessarily loaded when this executes).
Is there any way to solve this problem?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我已经使用以下方法成功实现了这一点:
.h 文件代码:
====================================== =================================================== ======
.m 文件
@synthesizescrollView;
@synthesize arrayContentData,viewControllers,bolPageControlUsed,intCurrIndex;
// 在滚动动画结束时,重置滚动源自 UIPageControl 时使用的布尔值
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
self.bolPageControlUsed = NO;
我
希望,这对大家有帮助。
干杯。
I have successfully achieved this using below method:
.h file code:
============================================================================================
.m file
@synthesize scrollView;
@synthesize arrayContentData, viewControllers, bolPageControlUsed, intCurrIndex;
// At the end of scroll animation, reset the boolean used when scrolls originate from the UIPageControl
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
self.bolPageControlUsed = NO;
}
I hope, it will be helpful to all.
Cheers.
是否有必要为 UIScrollView 中的每个页面都有一个单独的 UIViewController (PageViewController)?为什么不让你的 MainViewController 来处理这个呢?
当您在 Interface Builder 中构建 UI 时,旋转设备后调整视图(以及一般 UI)的大小会容易得多。
Is it necessary to have a separate UIViewController (PageViewController) for every page in your UIScrollView? Why not let your MainViewController take care of this.
Resizing your views (and your UI in general) after rotating the device is much easier when you build your UI in Interface Builder.
我不确定我是否理解正确。但是,有一些想法:
框架属性是一回事(A),视图内容如何显示是另一回事(B)。框架 CGRect 是超级视图(父视图)中视图的(理论上)边界。但是,您的视图不一定需要填充整个框架区域。
关于(A):
这里我们有 UIView 的 autoresizingMask 属性来设置当父视图调整大小时如何调整框架的大小。当你改变方向时就会发生这种情况。但是,您通常可以依赖默认设置(到目前为止对我有用)。
关于(B):
视图内容在视图框架中的分布方式由 UIView 的属性
contentMode
指定。使用此属性,您可以设置长宽比需要保持不变。例如,将其设置为 UIViewContentModeScaleAspectFit 或其他内容......请参见此处:
http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW99
PS :我写了“理论”,因为你的视图内容也可能超出这些框架边界 - 它们仅在 UIView 的 ClipsToBounds 属性设置为 YES 时限制视图。我认为苹果默认将其设置为“否”是一个错误。
I'm not absolutely sure I understand you right.. however, some thoughts:
The frame property is one thing (A), how the view contents are displayed in there is another (B). The frame CGRect is the (theoretical) boundary of your view in the superview (parent view) .. however, your View does not necessarily need to fill that whole frame area.
Regarding (A):
Here we have the UIView's
autoresizingMask
property to set how the frame is resized when the superview is resized. Which happens when you change the orientation. However, you can usually rely on the default settings (worked for me so far).Regarding (B):
How the view contents are distributet in the view frame is specified by UIView's property
contentMode
. With this property, you can set that the aspect ratio needs to stay intact. Set it toUIViewContentModeScaleAspectFit
for example, or something else..see here:
http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW99
PS: I wrote "theoretical", because your view contents may also exceed those frame boundaries - they are only limiting the view when UIView's clipsToBounds property is set to YES. I think it's a mistake that Apple set this to NO by default.
除了 Efrain 所写的内容之外,请注意,如果视图变换不是恒等变换,则当视图旋转时,frame 属性无效 - ie。
当然,您考虑到了您的视图需要处于新的偏移位置的事实,对吗?
In addition to what Efrain wrote, note that the frame property IS NOT VALID if the view transform is other than the identity transform -- i.e., when the view is rotated.
Of course, you accounted for the fact that your views need to be at a new offset position, right?