PresentModalViewController в CGRect

Можно ли представить контроллер модального представления таким образом, чтобы модальное представление было ограничено пространством, включенным в CGRect?

Если нет, объясните, как воспроизвести переход модального вида перекрестного растворения между двумя представлениями.

Спасибо.


person The Kraken    schedule 31.03.2012    source источник


Ответы (2)


Как насчет того, чтобы просто использовать анимацию UIView:

UIView* view = [[UIView alloc] initWithFrame:CGRectMake(x,y,w,h)];
[view setAlpha:0];
[self.view addSubView:view];

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[view setAlpha:1];
[UIView commitAnimations];

Вуаля! Он исчезает! :)

person David    schedule 31.03.2012

Чтобы выполнить перекрестное растворение в обычном контроллере представления, вы можете установить для его modalTransitionStyle значение UIModalTransitionStyleCrossDissolve, а затем представить его модально.

Чтобы выполнить перекрестное растворение между некоторой парой подпредставлений (ограниченных их CGRects кадра), вы можете использовать этот метод UIView:

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion.

Вот как вы можете использовать это в коде:

@interface ViewController ()

@property(strong,nonatomic) UIView *redView;
@property(strong,nonatomic) UIView *blueView;

@end

@implementation ViewController

@synthesize redView=_redView;
@synthesize blueView=_blueView;

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

    self.redView = [[UIView alloc] initWithFrame:CGRectMake(40.0, 40.0, 240.0, 100.0)];
    self.redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:self.redView];

    self.blueView = [[UIView alloc] initWithFrame:CGRectMake(40.0, 40.0, 240.0, 100.0)];
    self.blueView.backgroundColor = [UIColor blueColor];
}

- (IBAction)crossDisolve:(id)sender {

    UIView *fromView = (self.redView.superview)? self.redView : self.blueView;
    UIView *toView = (fromView==self.redView)? self.blueView : self.redView;

    [UIView transitionFromView:fromView
                    toView:toView
                  duration:1.0
                   options:UIViewAnimationOptionTransitionCrossDissolve
                completion:^(BOOL finished) {NSLog(@"done!");}
 ];

 // now the fromView has been removed from the hierarchy and the toView has been added
 // please note that this code depends on ARC to release objects correctly

}

Более сложная часть вашего вопроса - это идея сделать этот новый подвид «модальным», под которым, как я предполагаю, вы подразумеваете, что он покрывает только часть дисплея, но принимает исключительно фокус ввода. Ближайшим к этому в SDK является UIAlertView.

person danh    schedule 31.03.2012
comment
Большое спасибо. Не могли бы вы привести краткий пример его использования с подпредставлениями? - person The Kraken; 31.03.2012
comment
Вы имеете в виду переход UIView? Конечно, придумаю что-нибудь не очень проверенное и отредактирую свой ответ. - person danh; 01.04.2012
comment
Еще раз спасибо. Для моей конкретной ситуации я нашел ответ, который был выше вашего, чуть более полезным из-за его простоты. Я хотел бы отметить оба ответа правильными, но я обязательно проголосую за этот сразу. Еще раз спасибо. - person The Kraken; 01.04.2012
comment
@user817946, не беспокойтесь. Это проще, если вы не собираетесь обновлять свою иерархию представлений, которую, казалось, вы искали в вопросе. Но если вы просто хотите анимировать такое свойство представления, как alpha, используйте еще более простую блочную анимацию, рекомендованную Apple: [UIView animateWithDuration:0.5 animations:^{ view.alpha = 1.0; }]; - person danh; 01.04.2012