Overlay View с Subview, не знаю, как звонить в ВК - PullRequest
0 голосов
/ 20 мая 2011

Мне нужно, чтобы представление (infoView) отображалось как наложение поверх другого представления.Поскольку этот infoView должен вызываться из любого представления приложения (например, introView), я бы хотел, чтобы код был в VC infoViews и просто вызывал его методы, когда происходит действие в currentView (introView).Я не могу использовать push и pop, так как мне нужно изменить цвет фона (infoView) и особенно альфа вызывающего представления (introView), поэтому сейчас я делаю это с помощью insertSubview.

Мой кодсейчас: introVC .h

- (IBAction) openInf:(id)sender;
IBOutlet InfoVC *infoScreenVC;

introVC .m

- (IBAction) openInf:(id)sender {
    [infoScreenVC openInfoMethod];}

infoVC .h

- (IBAction) closeInfoPressed;
- (void) openInfoMethod;
- (void) closeInfoMethod;

infoVC .m

- (IBAction) closeInfoPressed {
    [self closeInfoPressed];}

- (void) closeInfoMethod {
[self.view removeFromSuperview];
[self.xx.view setAlpha:1.0f];}

- (void) openInfoMethod {
self.view.backgroundColor = [UIColor clearColor];
[self.xx.view setAlpha:0.2f];
[((MyAppAppDelegate *)[UIApplication sharedApplication].delegate).window 
    insertSubview: self.infoScreenVC.view aboveSubview: self.xx.view];}

Когда я нажимаю кнопку, чтобы показать infoView, мои NSLogs сообщают мне, что метод был вызван, но я вижу, что Subview не было добавлено.Я понятия не имею, что вставлять, где прямо сейчас в моем коде написано «хх», так как ссылка на VC из вступления не показывает мне экран.Если я помещаю этот код в introVC и изменяю его, он показывает infoView, вызывает правильный метод для закрытия, но снова не может закрыться (когда я в introVC).Я не могу понять, как сказать моему приложению, кто звонил венчурному инвестору, чтобы вернуться туда.В какой-то момент, когда весь код был в introVC, мне удалось даже удалить Subview, но я не смог установить Alpha для introVC обратно на единицу.

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

Большое спасибо!

// Редактировать после ответа sergios: intro.m

- (IBAction) openInf:(id)sender {
introViewController *introVC; 
[infoScreenVC openInfoMethod:];}

info.h

- (void) openInfoMethod:(introViewController *introVC);

info.m

- (void) openInfoMethod:(introViewController *introVC) { //error occurs here
self.view.backgroundColor = [UIColor clearColor];
[self.introVC.view setAlpha:0.2f];
[((MyAppAppDelegate *)[UIApplication sharedApplication].delegate).window 
insertSubview: self.infoScreenVC.view aboveSubview: self.introVC.view];}

и возникающая ошибка говорит

Expected ')' before 'introVC'

Я не уверен, как правильно передать ссылку на VC.Спасибо за вашу помощь !!

// РЕДАКТИРОВАТЬ Рабочий код:

Как это работает сейчас, я хотел бы подвести итог: - Я даю вызывающему VC (introVC) openInfoMethod в действии openInf, как [infoVC openInfoMethod:introVC].

  • В openInfoMethod я «сохраняю» вызывающий VC в локальной переменной типа introVC (?) И добавляю оверлей и т. Д.

  • Когдапроисходит действие infoViewController с именем closeInfoPressed, он вызывает метод infoViewController closeInfoMethod наподобие self closeInfoMethod:introVC.

  • В этом методе я удаляю self.view из Superview и устанавливаю альфа introVC.view в 1, как introVC.view setAlpha: 1.0f

Так что кодыintro.h

IBOutlet InfoscreenViewController *infoScreenVC;

@property (nonatomic, retain) IBOutlet InfoscreenViewController *infoScreenVC;
- (IBAction) openInf:(id)sender;

intro.m

@synthesize infoScreenVC;
- (IBAction) openInf:(id)sender {
UIViewController *introVC = self;
[infoScreenVC openInfoMethod:introVC];
}

info.h:

- (void) openInfoMethod:(UIViewController *)rootVC;
- (void) closeInfoMethod:(UIViewController *)callingVC;

info.m

- (void) closeInfoMethod:(UIViewController *)callingVC;{
[self.view removeFromSuperview];
[callingVC.view setAlpha:1.0f];
}

- (IBAction) closeInfoPressed{
[self closeInfoMethod:introVC];
[self.view removeFromSuperview];
}

Ответы [ 3 ]

1 голос
/ 20 мая 2011

Если ваша проблема заключается в том, чтобы «выяснить, как сообщить моему приложению, кто вызывал ВК, чтобы вернуться туда», почему бы вам не добавить параметр в селектор openInfo, например, здесь:

info.h

- (void) openInfoMethod:(introViewController *)introVC;

info.m

- (void) openInfoMethod:(introViewController *)introVC {
    <your implementation here>
}

будет ли это работать для вас?

РЕДАКТИРОВАТЬ: у вашего кода из intro.m есть небольшая проблема,

- (IBAction) openInf:(id)sender {
    introViewController *introVC; 
    [infoScreenVC openInfoMethod:];
}

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

Насколько я могуИсходя из вашего кода, intro.m должен быть файлом реализации для introViewController, поэтому вы можете просто позвонить:

    [infoScreenVC openInfoMethod:self];

, но, пожалуйста, перед тем, как сделать это, убедитесь, что self на самом деле ваш introViewController.

0 голосов
/ 22 мая 2011

Если я правильно понимаю ваш вопрос, ваш infoView должен быть подклассом UIView и создаваться из любого из ваших контроллеров представления с использованием:

InfoView *infoView = [[InfoView alloc] initWithFrame:CGRectMake(originX,originY,width,height)];

Затем вы просто добавляете его как подпредставление вашего представления контроллеров представления:

[self.view addSubView:infoView];
[infoView release]; // It's safe to release it here as your view controller's view is retaining it

И когда вы закончите с этим, просто позвоните

[infoView removeFromSuperview];

Кроме того, вы можете создать несколько простых методов внутри infoView, которые включают введение анимации при представлении или удалении представления. Вот пример постепенного появления и исчезновения, при котором предполагается, что вы изначально устанавливаете альфа на ноль при создании представления:

- (void)fadeIn {
    [UIView animateWithDuration:1.0f animations:^{self.alpha = 1.0f}];
}

И исчезают

- (void)fadeOut {
    [UIView animateWithDuration:1.0f animations:^{self.alpha = 0f} 
                                     completion:^(BOOL finished){self removeFromSuperView}];
}
0 голосов
/ 22 мая 2011

Это должно быть похоже на это

  • (void) openInfoMethod: (introViewController *), что вы неправильно передаете параметры.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...