重置UIPageControl将视图重置为原始状态

时间:2012-11-13 20:48:02

标签: objective-c uiimage uipagecontrol

我有一个带有ScrollView的iPad视图,下面我正在使用页面控制对象来显示它所在的页面。在屏幕上的其他地方,我有一个时间轴介于凌晨12点到凌晨5点之间 - 随着时间的推移,有一个UIImage在时间线的顶部变得更宽,以指示一天中的时间。随着时间的推移,UIImage变得越来越广泛,因为每分钟都会开始使用NSTimer。

此外,我在页面上有3个按钮,用于刷新Scrollview,其中包含一组新图像。图像的数量可以在3到7之间变化。因此,当按下按钮时,我更新滚动视图,并更新页面控制对象以将“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对象的情况下完成,但我现在对于为什么会发生这种情况非常好奇。谢谢!

1 个答案:

答案 0 :(得分:0)

我似乎已经通过将ScrollView和PageControl对象放入他们自己的(新)UIView来解决了这个问题。为此,我在界面构建器中打开了故事板,将一个View对象从工具箱中输出到界面窗口,然后将现有的ScrollView和PageControl对象放入新的UIView中。之后,更改PageControl的numberOfPages属性不会影响窗口上的任何其他内容。

我仍然对这种行为感到困惑。我猜是因为一旦页面控件被放置在一个新视图中并且问题停止了,那么当更改numberOfPages属性时,PageControl想要更新它所在的整个视图。