UIView всплывающее окно, как UIAlertView - PullRequest
8 голосов
/ 06 августа 2011

Я хочу UIView, который может всплывать как UIAlertView, а также может перемещаться.

Любая помощь, пожалуйста ??

Спасибо.

Ответы [ 2 ]

24 голосов
/ 06 августа 2011

Анимация преобразования представления с использованием анимации UIView ( с использованием блоков или старых API )

от какого-то действительно небольшого размера (например, view.transform = CGAffineTransformMakeScale(0.1, 0.1)) до чего-то немногобольше, чем вы хотите (например, view.transform = CGAffineTransformMakeScale(1.1, 1.1)), затем вернитесь к желаемому размеру (view.transform = CGAffineTransformMakeScale(0.1, 0.1)) или добавьте больше шагов для большего отскока.

И для его перемещения используйте сенсорные методы и изменяйте рамку вида при перемещении пальца.

Редактировать: вот пример кода для пользовательского UIViewt-подобного UIView.

MyAlertView.h:

#import <UIKit/UIKit.h>

@interface MyAlertView : UIView {
    CGPoint lastTouchLocation;
    CGRect originalFrame;
    BOOL isShown;
}

@property (nonatomic) BOOL isShown;

- (void)show;
- (void)hide;

@end

MyAlertView.m:

#import "MyAlertView.h"

@implementation MyAlertView

@synthesize isShown;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        originalFrame = frame;

        self.alpha = 0;
        self.backgroundColor = [UIColor whiteColor];

        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, 20)];
        label.text = @"Hellooooo!";
        label.textAlignment = UITextAlignmentCenter;
        label.backgroundColor = [UIColor clearColor];
        [self addSubview:label];
        [label release];

        UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        closeButton.frame = CGRectMake(10, frame.size.height - 45, frame.size.width - 20, 35);
        [closeButton setTitle:@"Close" forState:UIControlStateNormal];
        [closeButton addTarget:self action:@selector(hide) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:closeButton];
    }
    return self;
}


#pragma mark Custom alert methods

- (void)show
{
    NSLog(@"show");
    isShown = YES;
    self.transform = CGAffineTransformMakeScale(0.1, 0.1);
    self.alpha = 0;
    [UIView beginAnimations:@"showAlert" context:nil];
    [UIView setAnimationDelegate:self];
    self.transform = CGAffineTransformMakeScale(1.1, 1.1);
    self.alpha = 1;
    [UIView commitAnimations];
}

- (void)hide
{
    NSLog(@"hide");
    isShown = NO;
    [UIView beginAnimations:@"hideAlert" context:nil];
    [UIView setAnimationDelegate:self];
    self.transform = CGAffineTransformMakeScale(0.1, 0.1);
    self.alpha = 0;
    [UIView commitAnimations];
}

- (void)toggle
{
    if (isShown) {
        [self hide];
    } else {
        [self show];
    }
}

#pragma mark Animation delegate

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    if ([animationID isEqualToString:@"showAlert"]) {
        if (finished) {
            [UIView beginAnimations:nil context:nil];
            self.transform = CGAffineTransformMakeScale(1.0, 1.0);
            [UIView commitAnimations];
        }
    } else if ([animationID isEqualToString:@"hideAlert"]) {
        if (finished) {
            self.transform = CGAffineTransformMakeScale(1.0, 1.0);
            self.frame = originalFrame;
        }
    }
}

#pragma mark Touch methods

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    lastTouchLocation = [touch locationInView:self];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint newTouchLocation = [touch locationInView:self];
    CGRect currentFrame = self.frame;

    CGFloat deltaX = lastTouchLocation.x - newTouchLocation.x;
    CGFloat deltaY = lastTouchLocation.y - newTouchLocation.y;

    self.frame = CGRectMake(currentFrame.origin.x - deltaX, currentFrame.origin.y - deltaY, currentFrame.size.width, currentFrame.size.height);
    lastTouchLocation = [touch locationInView:self];
}

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

}

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

}

@end

Затем, где вы хотите показать это предупреждение, вам нужно:

#import "MyAlertView.h"

и:

MyAlertView *alert = [[MyAlertView alloc] initWithFrame:CGRectMake(20, 100, 280, 100)];
[viewFromWhichYouWillShowTheAlert addSubview:alert];
[alert release];

затем вы показываетес помощью [alert show];, скрытие с помощью [alert hide]; или переключение с помощью [alert toggle];

Вы также можете перемещать его, когда нажимаете и перетаскиваете (куда угодно, кроме кнопки закрытия). Надеюсь, этого достаточно дляНачало работы. Если вам нужно объяснение какой-либо части кода, просто спросите.

О, и обратите внимание, я установил цветэтот вид на белый, поэтому если вы показываете его поверх другого белого, вы его не увидите, поэтому просто измените цвет фона любого вида:)

0 голосов
/ 14 августа 2012

Вы можете приобрести это, просто выполнив следующие шаги

  1. Создайте UIview (ViewA) размером 320 * 480, чтобы оно охватывало весь экран iPhone с фоном, установленным в clearColor. Это послужит суперобзором для нашей цели;
  2. Создайте еще один UIView (ViewB) размером 320 * 480 с цветом фона, установленным на черный, и непрозрачностью до 40%. 3. Теперь вы можете добавить любой вид на ViewB.
  3. Теперь добавьте ViewB в ViewA.

Наконец, вы можете представить этот вид там, где это требуется. Эффект будет таким: ViewA покроет фоновый viewController, ViewB будет работать как подавляющий эффект для контроллера фонового представления, а представления на B - это UIElement, который вы увидите.

Для эффекта Анимация вы можете использовать базовый код анимации в UIElement на ViewB.

...