0

ScrollView を持つ iPad ビューがあり、その下で Page Control Object を使用して、どのページにあるかを表示しています。画面の他の場所には、たとえば午前 12 時から午前 5 時までのタイムラインがあります。時間の経過とともに、タイムラインの上に幅が広がり、時刻を示す UIImage が表示されます。UIImage は、1 分ごとに開始される 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 のサイズを変更するタイミングに関するメッセージを送信しています (この場合、ビューが表示されたときに 1 回だけ実行しています)。updateWidth ルーチンは、UIImage のサイズを 450 ピクセル幅に変更し、ビューが適切に表示されます。

ただし、ボタンをタップすると numberOfPages の値が変更されるため、UIImageView が最初に Interface Builder に配置されたときのサイズに戻ります。

誰かが見たい場合は、圧縮されたプロジェクト ファイルがあります。また、通知センターを使用せずにこれを試してみましたが、結果は同じでした (もともと通知センターを使用していなかったので、結果が異なる可能性があると考えていました)。

おそらく PageControl オブジェクトを使用しなくても問題は解決できますが、なぜこのようなことが起こるのか非常に興味があります。ありがとう!

4

1 に答える 1

0

ScrollView オブジェクトと PageControl オブジェクトの両方を独自の (新しい) UIView に配置することで、問題を解決したようです。これを行うには、インターフェイス ビルダーでストーリーボードを開き、View オブジェクトをツールボックスからインターフェイス ウィンドウにドラッグしてから、既存の ScrollView オブジェクトと PageControl オブジェクトの両方を新しい UIView に配置しました。その後、PageControl の numberOfPages プロパティを変更しても、ウィンドウの他の部分には影響しませんでした。

しかし、私はまだこの振る舞いについて混乱しています。ページ コントロールが新しいビューに配置され、問題が停止すると、numberOfPages プロパティが変更されたときに PageControl がそのビュー全体を更新したいと考えているためです。

于 2012-11-14T16:35:57.510 に答える