1

私はプロジェクトに取り組み始めたばかりで、すでにいくつかの問題とエラーがあります。バグがどこにあるのかを理解するのを手伝ってくれないかと思っていました。

簡単な概要: 2つのファイルがあります:(ViewController.mとScroller.m)。ViewControllerには、ViewDidLoadの下にいくつかのコードがあり(これについては後で説明します)、それが言うことを実行する関数(addImagesToView)もあり、いくつかのtouchsBegan、moved、endは扱いにくいためです。

Scrollerで、「-(void)touches」関数の実装のいくつかを書き直すことにしました。

私が抱えている問題 は、ボタン(addImagesToView関数からのもの)が強調表示されたままになることです。NSLogを使用していくつかのテストを実行し、どの「タッチ」が機能し、どの「タッチ」が機能しないかを確認しました。「touchesMoved」が正しく機能しません。ユーザーが下にドラッグすると、約3行または4行のテキストの後にログが停止します。なんとなく巻物の邪魔になると思います。

これはViewController.mのコンテンツです。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"bgPNG.png"]];

    imageView.frame = CGRectMake(0, 0, 320, 480);
    [self.view addSubview:imageView];

    //UIColor *background = [[UIColor alloc]initWithPatternImage:imageView.image];
    //self.view.backgroundColor = background;

    CGRect fullScreen = [[UIScreen mainScreen] applicationFrame];

    scroll = [[Scroller alloc] initWithFrame:fullScreen];
    scroll.contentSize = CGSizeMake(320, 2730);

    scroll.delaysContentTouches = NO;
    //scroll.canCancelContentTouches = NO;
    scroll.scrollEnabled  = YES;

    [self.view addSubview:scroll];

    buttons = [[NSMutableArray alloc]init];

    [self addImagesToView];



}

-(void) addImagesToView{




    CGFloat yCoordinate = 35;

    for (int i=1; i<=18; i++) {

        UIImageView *image = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"picture%d.png",i]]highlightedImage:[UIImage imageNamed:[NSString stringWithFormat:@"picture%dHG.png",i]]];

        CGRect position = CGRectMake(105, yCoordinate, IMAGE_SIZE, IMAGE_SIZE);
        image.frame = position;

        [scroll addSubview:image];

        image.userInteractionEnabled = YES;
        image.tag = i;

        [buttons addObject:image];
        yCoordinate += 150;


    }
}

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // Get any touch
    UITouch *t = [touches anyObject];


    if ([t.view class] == [UIImageView class])
    {

        // Get the tappedImageView
        UIImageView *tappedImageView = (UIImageView*) t.view;
        tappedImageView.highlighted = YES;
    }
}

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *t = [touches anyObject];
    if ([t.view class] == [UIImageView class])
    {

        // Get the tappedImageView
        UIImageView *tappedImageView = (UIImageView*) t.view;
        tappedImageView.highlighted = NO;
    }

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources th at can be recreated.
}

@end

これはScroller.mです

#import "Scroller.h"

@implementation Scroller

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!self.dragging)
        [self.nextResponder touchesBegan: touches withEvent:event];
    else
        [super touchesBegan: touches withEvent: event];
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *t = [touches anyObject];
    if ([t.view class] == [UIImageView class])
    {

        // Get the tappedImageView
        UIImageView *tappedImageView = (UIImageView*) t.view;
        tappedImageView.highlighted = NO;
    }

}


-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!self.dragging)
        [self.nextResponder touchesEnded: touches withEvent:event];
    else
        [super touchesEnded: touches withEvent: event];        // Get the tappedImageView

}

/*
 // Only override drawRect: if you perform custom drawing.
 // An empty implementation adversely affects performance during animation.
 - (void)drawRect:(CGRect)rect
 {
 // Drawing code
 }
 */

@end

また、ViewControllerにすべてのタッチを実装しようとしましたが、スクロールから読み取る方法がわかりません(SCROLLとSCROLLERの違いに注意してください)。

お分かりのように、私は次のように注文しようとしました:view-> backGroundImage-> scroller-> addImagesToView(function)、[I] addImagesToView[/I]から出てくる画像がスクロールの上に表示されるようにします。それが私の望ましい階層です。

どうもありがとうございます。

4

2 に答える 2

2

ボタンを押すための独自のタッチ処理ルーチンを作成する必要はありません。sを使用する代わりに、代わりにUIImageViews を作成し、それらのイベントUIButtonにフックします。UIControlEventTouchUpInside

于 2012-08-31T20:49:33.080 に答える
0

おそらくここで間違ったツリーを吠えているので、何を達成しようとしているのかを私たちに伝えたほうがよいと思います. ジムが言ったように、画像を選択するためのより良い方法があり、タッチを自分で処理したい場合でも、UIGestureRecognizers はおそらくより良いオプションです。ユーザーが画像を選択できるようにする場合は、github の iCarousel を参照することをお勧めします。これは、画像の選択に最適なオープン ソースのカルーセルです。また、iOS 6 をターゲットにすることができれば、新しいコレクション ビューが用意されています。

于 2012-08-31T20:58:42.753 に答える