重置 UIPageControl 将视图重置为原始状态
Posted
技术标签:
【中文标题】重置 UIPageControl 将视图重置为原始状态【英文标题】:Resetting UIPageControl Resets View To Original State 【发布时间】:2012-11-13 20:48:01 【问题描述】:我有一个 iPad 视图,它有一个 ScrollView,在它下面我使用一个页面控制对象来显示它所在的页面。在屏幕的其他地方,我在上午 12:00 和上午 5:00 之间有一个时间线 - 随着时间的推移,时间轴顶部有一个 UIImage 变宽以指示一天中的时间。通过使用每分钟左右启动的 NSTimer,随着时间的推移,UIImage 变得越来越宽。
此外,我在页面上有 3 个按钮,它们将使用其中的一组新图像刷新 Scrollview。图片的数量可以在 3 到 7 之间变化。因此,当按下按钮时,我会更新滚动视图,并更新 Page Control 对象以将“numberOfPages”属性设置为适当的数字。
好的,所以问题似乎是每当我单击一个按钮并且 pageControl numberOfPages 发生更改时,UIImage 就会恢复到我最初在 Interface Builder(故事板)中设计它时的大小。
我创建了一个简化的示例项目,希望它足以重新创建行为...
ViewController.h:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIButton *btnTest;
@property (weak, nonatomic) IBOutlet UIImageView *imgTest;
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
- (IBAction)buttonPress:(id)sender;
@end
ViewController.m: #import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize imgTest,btnTest,pageControl;
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// Set up an observer to handle updating the timeline
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(UpdateWidth:)
name:@"UpdateWidth" object:nil];
-(void)viewDidAppear:(BOOL)animated
// Send an updateTimeIndicator notification when screen loads.
[[NSNotificationCenter defaultCenter] postNotificationName:@"UpdateWidth" object:@"sent"];
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
- (IBAction)buttonPress:(id)sender
pageControl.numberOfPages = 7;
pageControl.currentPage = 0;
-(void)UpdateWidth:(NSNotification *)notification
[imgTest setFrame:CGRectMake([imgTest frame].origin.x, [imgTest frame].origin.y,
450, [imgTest bounds].size.height)];
imgTest.contentMode = UIViewContentModeScaleAspectFit; // This determines position of image
imgTest.clipsToBounds = YES;
[imgTest setNeedsDisplay];
NSLog(@"Width Updated");
@end
因此,在此示例中,我在 Window 中只有 3 个对象 - PageControl、一个 Button 和一个背景设置为蓝色的 UIImage。我正在使用通知中心发送关于何时调整 UIImage 大小的消息(在这种情况下,我只做一次,当视图出现时)。 updateWidth 例程将 UIImage 的大小调整为 450 像素宽,并且视图按原样显示。
但是,点击按钮会改变 numberOfPages 的值,并且这样做会将 UIImageView 设置回它最初在 Interface Builder 中布局时的大小。
如果有人想看的话,我确实有一个压缩的项目文件。另外,我确实在不使用通知中心的情况下尝试了这个,结果是一样的(我最初没有使用通知中心,只是认为它可能会给出不同的结果)。
我可能不使用 PageControl 对象也能过得去,但我现在很好奇为什么会这样。谢谢!
【问题讨论】:
我不明白这个问题:(你能把压缩后的项目发给我吗? omarfraiwan@gmail.com? 已发送电子邮件 - 谢谢!这是一个在没有实际看到的情况下很难解释的问题。我希望有一种方法可以在 *** 中附加项目文件。 【参考方案1】:我似乎通过将 ScrollView 和 PageControl 对象都放入它们自己的(新)UIView 中解决了这个问题。为此,我在界面生成器中打开了故事板,将工具箱中的 View 对象拖到界面窗口中,然后将现有的 ScrollView 和 PageControl 对象都放入新的 UIView 中。之后,更改 PageControl 的 numberOfPages 属性不会影响窗口上的任何其他内容。
我仍然对这种行为感到困惑。我猜是因为一旦页面控件被放置在新视图中并且问题停止了,PageControl 想要在 numberOfPages 属性更改时更新它所在的整个视图。
【讨论】:
以上是关于重置 UIPageControl 将视图重置为原始状态的主要内容,如果未能解决你的问题,请参考以下文章
Swift - UIBarButtonItem.customView - 重置为原始状态