0

我有一个 iPad 视图,它有一个 ScrollView,在它下面我使用一个页面控制对象来显示它所在的页面。在屏幕的其他地方,我在上午 12:00 和上午 5:00 之间有一个时间线 - 随着时间的推移,时间轴顶部有一个 UIImage 变宽以指示一天中的时间。UIImage 会随着时间的推移通过使用每分钟左右启动的 NSTimer 变得更宽。

此外,我在页面上有 3 个按钮,它们将使用其中的一组新图像刷新 Scrollview。图像的数量可以在 3 到 7 之间变化。因此,当按下按钮时,我会更新滚动视图,并更新 Page Control 对象以将“numberOfPages”属性设置为适当的数字。

好的,所以问题似乎是,每当我单击一个按钮并且 pageControl numberOfPages 发生更改时,UIImage 就会恢复到我最初在 Interface Builder(故事板)中设计它时的任何大小。

我创建了一个简化的示例项目,希望有足够的能力重新创建行为......

视图控制器.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 对象也能过得去,但我现在很好奇为什么会这样。谢谢!

4

1 回答 1

0

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

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

于 2012-11-14T16:35:57.510 回答