Отключить прокрутку через IBAction, содержащуюся в подпредставлении - PullRequest
0 голосов
/ 01 ноября 2011

Приложение для iPad на данный момент построено так: данные XML извлекаются с моего веб-сайта и анализируются в контроллере представления «FishIDView». Этот контроллер представления имеет UIScrollView «scrollView», который имеет подпредставление «XMLView», которое является UIView. scrollView настроен так, что он прокручивает и просматривает XMLViews на основе количества элементов, содержащихся в XML. Например, 12 элементов = 12 страниц или экземпляры XMLView. Эти страницы содержат фотографии отдельных рыб. Каждая из этих страниц содержит кнопку, которая создает подпредставление UIView «XMLView», называемое «flipView», и отображает подпредставление с помощью анимированного перехода с переворотом влево. Это подпредставление содержит информацию об изображенной рыбе. У flipView есть кнопка, которая возвращает пользователя (переворачивает назад) к изображению рыбы.

Моя проблема в том, что когда я смотрю на flipView (который является подпредставлением XMLView, который является подпредставлением scrollView), прокрутка все еще включена. Если я прокручиваю влево или вправо в режиме flipView, я вижу XMLView следующей рыбы. Я хочу, чтобы при просмотре flipView была отключена прокрутка.

Любые предложения о том, что я могу сделать, чтобы отправить что-то вроде команды setScrollEnabled: NO в scrollView (на FishIDView) из подпредставления?

EDIT:

Так что я предполагаю, что мне нужно использовать протокол и делегировать. Я думал, что смогу это выяснить, но я увлекся реализацией.

В моем XMLView.h (без постороннего кода):

@protocol XMLViewDelegate <NSObject>

- (void) stopScrolling;

@end

@interface XMLView : UIView 
{
    ...
    id                      secondDelegate;
}
...
@property (nonatomic, retain) id <XMLViewDelegate>    secondDelegate;
...

@end

Затем в моем XMLView.m (с подключенной IBAction к кнопке UIB, которая работает правильно):

...
@synthesize secondDelegate;
...
-(IBAction)goToInfo
{
    //[self newPage];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self cache:YES];
    [self.secondDelegate stopScrolling];
    [self addSubview:flipView];
    ...

    NSLog(@"button pressed");

}

В FishIDView.h:

@interface FishIDView : UIViewController <XMLViewDelegate>

FishIDView.m:

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

    [scrollView setScrollEnabled:YES];

    XMLView *subsubView = [[XMLView alloc] init];
    subsubView.secondDelegate = self;
    ...
}

-(void) stopScrolling
{
    [scrollView setScrollEnabled:NO];
    NSLog(@"NO more scrolling!!!");
}

Когда я нажимаю на свою кнопку в XMLView, которая вызывает «goToInfo», происходит остальное действие, но журнал «Нет больше прокрутки!» никогда не отображается.

Я поступил неправильно? Я все еще пытаюсь выяснить делегатов, поэтому я могу быть совершенно не прав с этой методологией.

РЕДАКТИРОВАТЬ 2:

Я уже пытался избавиться от делегата и идти по более упрощенному маршруту, но он все еще не работает правильно.

В XMLView.m:

-(IBAction)goToInfo
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self cache:YES];

    //The next 2 lines are what I added
    ViewController *mainView = [[ViewController alloc] init];
    [mainView stopScrolling];

    [self addSubview:flipView];
    [infoButton setEnabled:FALSE];
    [infoButton setHidden:YES];
    [title setHidden:YES];
    [UIView commitAnimations];

    NSLog(@"button pressed");

}

Затем в FishIDView.h

-(void) stopScrolling;

FishIDView.m

-(void) stopScrolling
{
    [scrollView setScrollEnabled:NO];
    NSLog(@"NO more scrolling!!!");
}

"Нет больше прокрутки!" печать, но scrollView по-прежнему включен прокрутки! Почему он запускает NSLog часть stopScrolling, но не setScrollEnabled: NO? Может кто-нибудь мне помочь?

1 Ответ

2 голосов
/ 26 января 2012

Решено! Я включил Уведомления вместо того, чтобы пытаться напрямую вызывать метод из подпредставления.

Быстрый обзор моей настройки. UIViewController FishIDView содержит UIScrollView, называемый scrollView. scrollView имеет подвид XMLView. У XMLView есть кнопка, которая показывает его подпредставление, flipView. Я хотел, чтобы прокрутка была отключена на scrollView, когда flipView был видим.

В XMLView.h (без значения нерелевантный код):

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

#define kApplicationDidStopScrollingNotification @"StopScroll"
#define kApplicationDidResumeScrollingNotification @"ResumeScroll"

#import "FishIDView.h"

@interface XMLView : UIView 
{
    IBOutlet UIButton       *infoButton;
    IBOutlet UIButton       *closeButton;
    IBOutlet UIView         *flipView; 
}

@property (nonatomic, retain) IBOutlet UIButton       *infoButton;
@property (nonatomic, retain) IBOutlet UIButton       *closeButton;

- (IBAction)goToInfo;

- (IBAction)closeSubView;

@end

В XMLView.m:

#import "XMLView.h"

@implementation XMLView

@synthesize infoButton, closeButton;

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

//Allows button to be pressed while contained in subview of scrollview
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    CGPoint hitPoint = [infoButton convertPoint:point fromView:self];
    CGPoint closePoint = [closeButton convertPoint:point fromView:flipView];
    if ([infoButton pointInside:hitPoint withEvent:event]) return infoButton;
    if ([closeButton pointInside:closePoint withEvent:event]) return closeButton;
    return [super hitTest:point withEvent:event];  
}

-(IBAction)goToInfo
{
    //post notification for FishIDView to listen to to trigger method that disables scrolling
    [[NSNotificationCenter defaultCenter] postNotificationName:kApplicationDidStopScrollingNotification object:nil];

    [self addSubview:flipView];

    //custom transition between views. A cross-fade effect
    flipView.alpha = 0.0f;
    [UIView beginAnimations:@"fadeInSecondView" context:NULL];
    [UIView setAnimationDuration:0.5];
    flipView.alpha = 1.0f;

    [infoButton setEnabled:FALSE];

    [UIView commitAnimations];   
}

- (IBAction)closeSubView
{
    //post notification to resume scrolling
    [[NSNotificationCenter defaultCenter] postNotificationName:kApplicationDidResumeScrollingNotification object:nil];

    flipView.alpha = 1.0f;
    [UIView beginAnimations:@"fadeInSecondView" context:NULL];
    [UIView setAnimationDuration:0.5];
    flipView.alpha = 0.0f;

    [infoButton setEnabled:TRUE];

    [UIView commitAnimations];
    [flipView performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:1.2];

}

@end

Обязательно поместите #import "XMLView.h" в файл FishIDView.h вверху и создайте методы - (void) внизу.

#import <UIKit/UIKit.h>

#import "XMLView.h"

@class AppDelegate;

@interface FishIDView : UIViewController <UIScrollViewDelegate>
{
...
}

@property ...

//These are the 2 methods that turn scrolling on and off
-(void) stopScrolling;
-(void) resumeScrolling;

@end

Затем в FishIDView.m

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

    //Listen for the notification to stop scrolling
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stopScrolling) name:kApplicationDidStopScrollingNotification object:nil];

    //Listen for the notification to resume scrolling
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resumeScrolling) name:kApplicationDidResumeScrollingNotification object:nil];
    [self layoutSubview];
}

-(void) stopScrolling
{    
    [scrollView setScrollEnabled:NO];
    NSLog(@"NO more scrolling!!!");
}

-(void) resumeScrolling
{    
    [scrollView setScrollEnabled:YES];
    NSLog(@"begin scrolling again!!");
}

Если у кого-то возникнут вопросы или возникнут проблемы с его реализацией, я буду рад поделиться с вами моим кодом. Я просто опустил большую часть этого, потому что это действительно не относится к этой теме.

...