5

コンテンツビューコントローラーとしてUIPopoverControllerポップオーバーを開きます。UITableViewController

ポップオーバーには適切なサイズがあり、一見したところコンテンツ ビューは正しく調整されますが、ポップオーバー内をスクロールしようとすると、スクロールするべきではありませんが、スクロールします。-(void)viewDidAppear (写真 1、2) の後、コンテンツ ビューが約 20 ピクセル高くなるようです。サイズを確認するにはどうすればよいですか:

- (void)viewDidAppear:(BOOL)animated
{
    NSLog(@"%@", self.view);
}

出力は

Popovers[3016:c07] <UITableView: 0x10b80600; frame = (0 0; 200 66); autoresize = W+H; gestureRecognizers = <NSArray: 0x1004cc20>; layer = <CALayer: 0x1004c4a0>; contentOffset: {0, 0}>

この時点でサイズは正しく、ポップオーバーのサイズと同じです。ポップオーバーを開いた後、余白を除いた内側のサイズは 66 ピクセルです (定規アプリを使用して測定)。したがって、コンテンツ ビューのサイズに正確に収まるように思われます。しかし、なぜか思わぬ縦スクロールが現れる。

よりも、ポップオーバーの高さに 20 ピクセルを追加すると、 [mOptionPopoverController setPopoverContentSize:(CGSize){200, 86}]; コンテンツ ビューも増加し、スクローラーなしで期待どおりに収まります。唯一の問題は、ポップオーバーの下部に空の 20 ピクセルが必要ないことです (写真 3)。

問題を再現するために小さなテストプロジェクトを作成しました。重要なコードは次のとおりです。

@implementation ViewController

- (IBAction)buttonPressed:(id)sender
{
    TableViewController *popoverViewController = [[TableViewController alloc] initWithStyle:UITableViewStyleGrouped];
    UIPopoverController* mOptionPopoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
    [mOptionPopoverController setPopoverContentSize:(CGSize){200, 66}]; 
    CGRect popoverRect = [self.view convertRect:[sender frame] fromView:[sender superview]];
    [mOptionPopoverController presentPopoverFromRect:popoverRect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}

@end

@implementation TableViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        self.tableView.bounces = NO;
    }
    return self;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    return cell;
}

- (void)viewDidAppear:(BOOL)animated
{
    NSLog(@"%@", self.view);
}

@end

pic.1 ここに画像の説明を入力

pic.2 ここに画像の説明を入力

pic.3 ここに画像の説明を入力

そして、ここに私が期待するものがあります: ここに画像の説明を入力

アップデート。

さらに調査を行いました。フレームの変化に合わせてKVOを使いました。役に立つものを見つけるのに役立つと期待していました。そして、私は何かを見つけましたが、それは物事をより明確にするものではありませんでした.

そこで、 TableViewController[self.view addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];のメソッドに追加し- (id)initWithStyle:(UITableViewStyle)style、観測メソッドは

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"%@", [object valueForKeyPath:keyPath]);
}

そして、ここに出力があります:

2013-05-27 15:52:12.755 Popovers[1547:c07] NSRect: {{0, 0}, {200, 84}}
2013-05-27 15:52:12.756 Popovers[1547:c07] NSRect: {{0, 0}, {200, 84}}
2013-05-27 15:52:12.756 Popovers[1547:c07] NSRect: {{0, 0}, {200, 66}}
2013-05-27 15:52:12.759 Popovers[1547:c07] <UITableView: 0x9337600; frame = (0 0; 200 66); autoresize = W+H; gestureRecognizers = <NSArray: 0x8949760>; layer = <CALayer: 0x8944690>; contentOffset: {0, 0}>

(最後は から- (void)viewDidAppear:(BOOL)animated)。

なぜ84?それ84-66=18は であり、これらは私が探している 20 ピクセルではありません。さらに、オブザーバーのメソッドの 3 つの呼び出しはすべて、tableView データ ソース メソッドが呼び出される前に発生します。tableViewが構築される前にフレームを知るにはどうすればよいですか?

(@ robmayoff tableView.scrollEnabled = NO;によって提案された現在使用している質問が多すぎるため、不要なポップオーバーを抑制します。)

アップデート。 Apple システムの印刷ポップオーバーでさえ、プリンター選択リストに 20 ピクセルと不要なスクローラーがあります。

4

2 に答える 2

1

これはどうやら Apple のバグで、WWDC 2013 の期間中に Apple のエンジニアに質問され、回答が得られなかったためです。

回避策は

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.1f;
}
于 2014-03-03T18:32:12.893 に答える
0

テーブルビューのスクロール有効プロパティを次のように設定してみてください。

tableView.scrollEnabled = NO;
于 2013-05-27T11:41:13.890 に答える