2

私のアプリには、ユーザーがアプリのすべてのページのサムネイルを含むメニューを開いてから、特定のページをタップできる機能があります。これは基本的に、各ページのサムネイル画像をUIScrollView追加したです。UIButton

サムネイル メニューは、アプリの途中にあるページの 1 つで開くと、完全に機能します。ただし、サムネイルメニューを開いた後、スクロールビューのボタンの 90% がタッチされない場合が多くあります。これは通常、ユーザーが手動でアプリの最後に到達し、サムネイル メニューを開いたときに発生します。

コードは次のとおりです。

@interface BookmarkManager : UIView{
    UIScrollView *thumbnailScrollView;
}
@property (strong) UIScrollView *thumbnailScrollView;


@implementation BookmarkManager

@synthesize thumbnailScrollView;

-(id)init{
    self = [super initWithFrame:CGRectMake(0, 0, 1024, 768)];
    if(self){
        [self setBackgroundColor:[UIColor clearColor]];

        thumbnailScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 1024, 120)];
        [thumbnailScrollView setBackgroundColor:[UIColor clearColor]];

        UIImageView *background = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/thumbnail_background.png", [[NSBundle mainBundle] resourcePath] ]]];
        [self addSubview:background];

        for(int i = 0; i < totalPages; i++){

            UIButton *pageThumbnail = [UIButton buttonWithType:UIButtonTypeCustom];
            [pageThumbnail setFrame:CGRectMake(0, 0, 125, 95)];
            [pageThumbnail setImage:[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/p%d_thumb.png", [[NSBundle mainBundle] resourcePath], i]] forState:UIControlStateNormal];

            pageThumbnail.titleLabel.text = [NSString stringWithFormat:@"%d",i];

            pageThumbnail.center = CGPointMake(20 + (i * pageThumbnail.frame.size.width) + (i * 20) +(pageThumbnail.frame.size.width/2), 60);

            [thumbnailScrollView addSubview:pageThumbnail];
            [pageThumbnail addTarget:self action:@selector(thumbnailTapped:) forControlEvents:UIControlEventTouchDown];

        }

        [self addSubview:thumbnailScrollView];
        [thumbnailScrollView setContentSize:CGSizeMake(totalPages * 125 + (20*(totalPages+1)), 120)];

    }

    return self;
}


-(void)thumbnailTapped:(id)sender{

    UIButton *thumbnailButton = sender;
    int pageNumber = [thumbnailButton.titleLabel.text intValue];

    NSLog(@"tapped thumbnail for page: %d", pageNumber);
    [bookmarkManagerDelegate jumpToPage:pageNumber];

}

に設定userInteractionEnabled = YESしてpageThumbnailみましthumbnailScrollView bringSubviewToFront:pageThumbnailたが、うまくいきませんでした... ボタンは常に完全に適切に表示されます。 . それはなぜでしょうか?

編集: を実装UIScrollView's scrollViewDidEndDeceleratingしました。シミュレーターでは呼び出されますが、デバイスでは呼び出されません。ボタンの画像が大きすぎる可能性がありますか?

4

3 に答える 3

1

私は自分のアプリで同じことをします。setImage:の代わりにsetBackgroundImageを使用してみてください。それは私のために働く

于 2012-07-10T19:53:49.173 に答える
1

私は過去に似たようなことをしました。唯一の違いは、フレームをボタンに設定する方法です。多分それが問題です

-(void)makeIconsView:(UIScrollView*)full :(NSArray*)images{
    int row=0;
    int column=0;
    for(int i = 0; i < images.count; ++i) {

        UIImage *thumb = [images objectAtIndex:i];
        UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];

        button.frame = CGRectMake(column*100+14, row*90+10, 84, 80);
        [button setImage:thumb forState:UIControlStateNormal];
        [button addTarget:self 
                   action:@selector(clickImage:) 
         forControlEvents:UIControlEventTouchUpInside];
        button.tag = i;
        button.layer.shadowColor = [UIColor colorWithWhite: 0.15 alpha: 0.55].CGColor;
        button.layer.zPosition = -8;
        button.layer.shadowOffset = CGSizeMake(0, 5);
        button.layer.shadowOpacity = 1;
        button.layer.shadowRadius = 2.0;
        button.clipsToBounds = NO;
        [full addSubview:button];

        if (column == 2) {
            column = 0;
            row++;
        } else {
            column++;
        }

    }

    [full setContentSize:CGSizeMake(320, (row+1) * 90 + 10)];   
}
于 2012-07-10T20:26:23.567 に答える
0

スクロール ビューのスクロール アニメーションがシミュレーターでは非常にスムーズであるのに、デバイス (iPad 3) では遅いことに気付いたとき、私は を実装してみUIScrollViewDelegateました。

シミュレーターでは、scrollViewWillBeginDeceleratingとの両方scrollViewDidEndDeceleratingが呼び出されていました。デバイスで、scrollViewWillBeginDecelerating呼び出されていましたが、呼び出さscrollViewDidEndDeceleratingれませんでした。

この理由は、デバイス上で、スクロールビューの処理が多すぎて、コンテンツの最終位置がどこにあるかの計算が完了していないことが考えられます。したがって、コンテンツのアニメーション化と再配置が完了するまで、タッチを却下します。ただし、コンテンツが重い場合、これには時間がかかりすぎます。

だから私の解決策は、スクロールビューが減速し始めるとすぐにアニメーションを殺すことでした. 私は単にこれを実装しました:

-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
    CGPoint offset = scrollView.contentOffset;
    [scrollView setContentOffset:offset animated:NO];
}

この他のStackOverflow answer の厚意による。

于 2012-07-10T21:13:31.070 に答える