Не можете перетащить объект при создании подкласса UIScrollView в iOS 5, помогите? - PullRequest
1 голос
/ 19 февраля 2012

Прежде всего, этой проблемы не было в iOS 4.3. Я все еще могу запустить программу в iOS 4.3 и не вижу никаких проблем. Во-вторых, это приложение для iPad.

Проблема в том, что когда я удерживаю изображение и перетаскиваю его, оно не будет перетаскиваться. Работало в iOS 4.3, но не в iOS 5.

Я создал новый проект тестирования и очистил все, что не нужно. Проект, который я выбрал, является приложением Single View и не изменял ни один из файлов AppDelegate.

Вот код.

myUIScrollViewClass.h

#import <UIKit/UIKit.h>


@interface myUIScrollViewClass : UIScrollView
{
}

@end

myUIScrollViewClass.m

#import "myUIScrollViewClass.h"


@implementation myUIScrollViewClass


- (id)init
{
    self = [super init];

    if (self) 
     {
     }

    return self;
}

- (void)didReceiveMemoryWarning
{
    [self didReceiveMemoryWarning];
}


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

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{      
     [self.nextResponder touchesMoved: touches withEvent:event]; 
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{
     [self.nextResponder touchesEnded: touches withEvent:event]; 
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

{
     [self.nextResponder touchesCancelled: touches withEvent:event]; 
}

@end

ViewController.h

#import <UIKit/UIKit.h>
#import "myUIScrollViewClass.h"

@interface ViewController : UIViewController <UIScrollViewDelegate>
{
     myUIScrollViewClass *mainScrollView_;
     UIImageView *aTouchedImage_;
}

@property (retain, nonatomic) myUIScrollViewClass *mainScrollView_;
@property (retain, nonatomic) UIImageView *aTouchedImage_;

@end

ViewController.m

#import "ViewController.h"

@implementation ViewController

@synthesize mainScrollView_;
@synthesize aTouchedImage_;

- (void)didReceiveMemoryWarning
{
     [super didReceiveMemoryWarning];
     // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
     mainScrollView_ = [[myUIScrollViewClass alloc] initWithFrame:self.view.frame];
     [self.view addSubview:mainScrollView_];

     mainScrollView_.delegate = self;
     mainScrollView_.contentSize = CGSizeMake(1024, 768);
     mainScrollView_.clipsToBounds = YES;
     mainScrollView_.bounces = NO;
     mainScrollView_.bouncesZoom = NO;
     mainScrollView_.showsVerticalScrollIndicator = NO;
     mainScrollView_.showsHorizontalScrollIndicator = NO;
     mainScrollView_.backgroundColor = [UIColor whiteColor];
     mainScrollView_.userInteractionEnabled = YES;

     aTouchedImage_ = [[UIImageView alloc] initWithImage: [UIImage imageNamed:@"image1.png"]];
     [aTouchedImage_ setFrame:CGRectMake(0, 0, 80, 80)];
     [mainScrollView_ addSubview:aTouchedImage_];
     [aTouchedImage_ setCenter:CGPointMake(512, 334)];


     [super viewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{     
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
     [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
     [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
     // Return YES for supported orientations
     return YES;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)anEvent
{
     mainScrollView_.scrollEnabled = NO;


     for (UITouch *touch in touches) 
     {
          [aTouchedImage_ setCenter:[touch locationInView:self.view]];
     }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)anEvent
{           
     mainScrollView_.scrollEnabled = NO;


     for (UITouch *touch in touches) 
     {
          [aTouchedImage_ setCenter:[touch locationInView:self.view]];
     }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)anEvent
{
     mainScrollView_.scrollEnabled = YES;


     for (UITouch *touch in touches)
     {        
     }
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)anEvent
{
    mainScrollView_.scrollEnabled = YES;

    for (UITouch *touch in touches) 
    {
    }
}

@end

1 Ответ

1 голос
/ 09 марта 2012

Кажется, я отвечу на свой вопрос.

Я запросил поддержку у технической поддержки разработчиков Apple, и они сказали мне поместить мой код в UIScrollView, а не передавать сенсорные события в другое представление. Сами Apple признает, что существует проблема с передачей сенсорных событий.

Вот выдержка из их ответа:

"Похоже, что не все сенсорные события проходят через ваш контроллер представления. Ваш UIScrollView блокирует сенсорные события от прохождения, даже если перенаправляет эти события следующему респонденту. Поведение очень неустойчивое, некоторые сенсорные события переадресация вашему контроллеру представления, но не всем. "

"Выглядит как изменение поведения в iOS 5.0.x. Полагаю, это из-за представленной функции сдерживания контроллера представления."

Другой способ сделать это - использовать UIGestureRecognizer для реализации перетаскивания представлений. Что-то вроде кода ниже:

- (void)viewDidLoad 
{
    // ... other initialization code here

    UILongPressGestureRecognizer *longPress = [[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(dragChild:)] autorelease];
    [longPress setMinimumPressDuration:0]; // recognize immediately when a finger comes down
    [draggableView addGestureRecognizer:longPress];
}

- (void)dragChild:(UILongPressGestureRecognizer *)longPress 
{
    [[longPress view] setCenter:[longPress locationInView:[[longPress view] superview]];
}
...