2014-01-17 2 views
2

Как я могу уволить UIView, который находится над основным контентом? Подумайте об этом как всплывающее окно тура с помощью кнопки закрытия. Вот код, который я использую, но он не работает. Никаких ошибок или предупреждений просто не кажется, что они делают трюк. Есть идеи?UIButton закрывает UIView

- (void) showUserSettings { 
     UIView *settingsPopover = [[UIView alloc] init]; 
     settingsPopover.frame = CGRectMake(20, 600, 280, 350); 
     [settingsPopover.layer setBackgroundColor:[UIColor colorWithRed:(241/255.0) green:(241/255.0) blue:(241/255.0) alpha:1].CGColor]; 

     [UIView animateWithDuration:0.35 animations:^{ 
      settingsPopover.frame = CGRectMake(20, 130, 280, 350); 
      settingsPopover.alpha = 1.0f; 
     } completion:^(BOOL finished) { 
     }]; 


     UIButton *closeSettings = [[UIButton alloc] initWithFrame:CGRectMake(245, 0, 35, 40)]; 
     [closeSettings setBackgroundColor:[UIColor colorWithRed:(212/255.0) green:(121/255.0) blue:(146/255.0) alpha:1]]; 
     [closeSettings setTitle:@"X" forState:UIControlStateNormal]; 
     [closeSettings addTarget:self action:@selector(closeSettings) forControlEvents:UIControlEventTouchUpInside]; 

     [settingsPopover addSubview:closeSettings]; 
     [self.view addSubview:settingsPopover]; 
    } 

    - (void) closeSettings { 
     [UIView animateWithDuration:0.35 animations:^{ 
     _settingsPopover.frame = CGRectMake(20, 400, 280, 350); 
     _settingsPopover.alpha = 1.0f; 
     } completion:^(BOOL finished) { 
     [_settingsPopover removeFromSuperview]; 
     }]; 
    } 
+1

Установите точки останова и убедитесь, что код проходит по мере его создания. – esqew

+0

Вы уверены, что кнопка находится внутри closeSettings? попробуйте изменить цвет фона кнопки, если он находится за пределами настроек настроекPopOver touchEvents не будет работать – Joshua

+0

Кнопка определенно видит touchEvent. Когда я делаю что-то глупое, как добавление другого UIView при нажатии кнопки закрытия, он отлично работает. По какой-то причине я просто не могу заставить его отказаться от UIView. – user3167213

ответ

5

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

Это то, что вы сделали, вы создали и init'ed новый UIView называется settingsPopover

UIView *settingsPopover = [[UIView alloc] init];  
... 
[self.view addSubview:settingsPopover]; 

И тогда вы удаляете другой вид называется _settingsPopover, который не имеет никакой связи с вашей локально созданной в целях Метод showUserSettings.

Предполагаете, что вы создали глобальную переменную типа UIView под названием _settingsPopover. И если это так, то это должно быть в вашем методе -(void)showUserSettings добавить одну строку и изменить другую строку, чтобы исправить все это. Посмотри ниже:

-(void)showUserSettings{ 
    ... 
    [settingsPopover addSubview:closeSettings]; <-- in your method the code up to here is fine 

    // add this line before your addsubview code 
    _settingsPopover = settingsPopover; //We are copying over your local variable to your global variable 

    //and change this line from 'settingsPopover' to '_settingsPopover' 
    [self.view addSubview:_settingsPopover]; 

Таким образом, ваша вновь созданный переменное зрения типа называется settingsPopover, что вы создали локально в методе showUserSettings будет скопирован в глобальном переменный с именем _settingsPopover переменными, и то переменное вы хотите добавить как подпункт.

Этот способ позволяет ссылаться на него позже, когда вы хотите удалить его из супервизора, который вы уже делаете, с помощью [_settingsPopover removeFromSuperview]; в вашем методе closeUserSettings. Весь ваш другой код в порядке.

+0

О да! Спасибо, человек, отлично работал. – user3167213

+0

В любое время приятель @ user3167213 – Pavan

3

То, что вы здесь делаете, также можно назвать «Внедрение заставки». Заставка - не что иное, как быстрый визуальный учебник для пользователя, предназначенный для быстрого поиска функций.

good tutorial о внедрении экрана Splash в приложении iOS.

Реализация с таймером собственной заставки:

1) Создать новый контроллер представления. Назовите его SplashViewController, который наследует от UIViewController. Вам не нужно ничего реализовывать в интерфейсе и классе реализации.

2) Создайте новый файл nib. Назовите его SplashView. Откройте его с помощью Interface Builder и добавьте ImageView в представление. Затем назначьте изображение, которое вы хотите использовать для экрана заставки, в представление изображения (Inspector -> Attributes -> Image View -> Image).

3) Теперь давайте добавим код в приложение делегата класса интерфейса первого, так это выглядит, как на примере ниже:

@class SplashViewController; 

@interface MyAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    UINavigationController *navigationController; 
    SplashViewController *splashViewController; 
} 

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController; 
@property (nonatomic, retain) IBOutlet SplashViewController *splashViewController; 
@end 

Единственное, что вам нужно сделать, это указать ваш контроллер представления выплеска и добавить свойство. Не забудьте импортировать SplashViewController с помощью @class.

4) Далее, обобщать переменную splashViewController в классе реализации и расширить класс следующим кодом:

-(void)applicationDidFinishLaunching:(UIApplication *)application { 
    splashViewController = [[SplashViewController alloc] initWithNibName:@"SplashView" bundle:nil]; 
    [window addSubview:splashViewController.view]; 
    [window makeKeyAndVisible]; 
    [NSTimer scheduledTimerWithTimeInterval:1.5f target:self selector:@selector(onSlashScreenDone) userInfo:nil repeats:NO]; 
} 

Инициализировать контроллер представления заставки и добавить его как подвид в главном окне. Определите желаемое время заставки с помощью запланированногоTimerWithTimeInterval: 2.0f (2.0 - 2 секунды). Кроме того, добавьте следующий метод к классу:

-(void)onSlashScreenDone{ 
    [splashViewController.view removeFromSuperview]; 
    [window addSubview:[navigationController view]]; 
    [window makeKeyAndVisible]; 
} 

Метод onSlashScreenDone вызывается, когда таймер истек. Он удаляет контроллер отображения всплесков и добавляет контроллер наблюдения в качестве подсмотра и делает его видимым (в нашем примере - контроллер навигации).

Я использовал его в своем приложении. Дайте мне знать, если вам нужна дополнительная информация. :)

+0

просто сообщая вам, что ОП не просил об этом. ОП спросил, почему его взгляд не снимается с надзора при нажатии кнопки. Он полностью осведомлен о том, как добавить subview на страницу и как настроить его контроллеры. Но эй это хороший учебник для заставки :) – Pavan

+0

@Pavan .. Да, может быть ... но я попытался предложить лучший подход к его намерению. Дайте мне знать, если где-то не так. :) –

+1

Хотя это не тот пост, это хороший код для тех, кто хочет создать заставку. : D – Pavan

Смежные вопросы