2011-11-24 26 views
10

UIAlertView'in dışında herhangi bir yere tek dokunuşla çıkmak istiyorum. UIAlertView’i herhangi bir buton olmadan göstermek istiyorum.iOS UIAlertView, bir yerden herhangi bir tuşla nasıl kapatılır?

Burada standart UIAlertView kodları var, ancak mümkünse nasıl işten çıkarılacağına dair girdiye ihtiyacım var.

UITouch ile? UITapGestureRecognizer ile?

Teşekkür ederiz.


DÜZENLEME:

viewDidLoad

burada adı "uyarı"

 if (alert) 
    { 
    emptyview = [[UIView alloc]initWithFrame:CGRectMake(0,0,320,480)]; 
    emptyview.backgroundColor = [UIColor clearColor]; 
    [self.view addSubview:emptyview]; 
     [emptyview addSubview:alert]; 
    NSLog (@"emptyview is there!"); 

     UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
     [emptyview addGestureRecognizer:singleTap]; 
     [singleTap release];    
    } 

Ama bu emptyview doesnt hiç yanıt vermeyen ve handleSingleTap seçicinin yanıt vermiyor ile

alertview başlatma Ben biraz yeniden yazdım:

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{ 
    [alert dismissWithClickedButtonIndex:0 animated:YES]; 
    [emptyview removeFromSuperview]; 
} 

Uyarı görüntülendiğinde bu boş görünüme dikkat etmeliyim, ardından tek dokunuşla uyarıyı kapatabilirim.

Denedim: Elbette

 if (alert) 
    { 
    emptyview = [[UIView alloc]initWithFrame:CGRectMake(0,0,320,480)]; 
    emptyview.backgroundColor = [UIColor clearColor]; 
    [self.view addSubview:emptyview]; 
     [emptyview addSubview:alert]; 
    NSLog (@"emptyview is there!"); 

     UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
     [alert addGestureRecognizer:singleTap]; 
     [singleTap release];    
    } 

, uyarı handleSingleTap işlevine tepki verdi. Boş görüntülemede neyi yanlış yaptım?


İKİNCİ DÜZENLEME:

Ne bu durumda elde etmek istediğiniz Eğer varsa, Kindle uygulaması bir kelimeyi, benzer işlevi seçtikten sonra açıklama ile küçük bir görünüm göstermektir. Belki UIAlertView yerine UIView oluşturmalıyım? Ancak Kindle app küçük görünüm altında gölge ile çok güzel, nasıl mümkün olabilir?

cevap

10

bu görünümünü kaldırmak bu wiew için takın. İyi haber, birileri bunu zaten yapmış. See this project.

Düzelt: iToast kullanmak istemiyorum. Tarzını beğendim, daha az kod. İşte ben buyum. Diğerleri, UIAlertView modelinin modal doğasının üstesinden gelmenin tek yolunun dokunma olaylarını ele almak için bir süper görünüm eklemesi gerektiği gibi açıkça görülüyor. Ancak bunu her zaman manuel olarak yapmak zorunda değilsiniz, UIAlertView alt sınıflarını göz önünde bulundurun. boyutunu ayarlamak için iyi bir yer olmaktan kafaları yukarı yaklaşık setFrame: için @wagashi, benim cevap kabul için teşekkürler, ve teşekkür:

Düzenleme: Böyle bir şey deneyin.Kodunuz çok kızarmış küçük bir uyarı yapar, ancak denediğimde mesajın uzun olması halinde görüşün dağıldığını fark ettim. Bu yüzden, uyarının boyutunu tek bir tuşun boyutuyla azaltmak ve ekranda ortalanmış olarak kalmak için setFrame:'u değiştirdim. Böylece sınıf, "iOS, UIAlertView'ı bir yerden herhangi bir tuşla nasıl kapatır?" Başlıklı soru başlığını doğru bir şekilde yanıtlıyor.

NoButtonAlertView.h

#import <UIKit/UIKit.h> 
@interface _NoButtonAlertViewCover : UIView 
@property (nonatomic,assign) UIAlertView *delegate; 
@end 
@interface NoButtonAlertView : UIAlertView 
-(id)initWithTitle:(NSString *)title message:(NSString *)message; 
@end 

NoButtonAlertView.m

#import "NoButtonAlertView.h" 
@implementation _NoButtonAlertViewCover 
@synthesize delegate = _delegate; 
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [self removeFromSuperview]; 
    [_delegate dismissWithClickedButtonIndex:0 animated:YES]; 
} 
@end 
@implementation NoButtonAlertView 
-(void)show{ 
    [super show]; 
    _NoButtonAlertViewCover *cover = [[_NoButtonAlertViewCover alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    cover.userInteractionEnabled = YES; 
    cover.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:.01]; 
    cover.delegate = self; 
    [self.superview addSubview:cover]; 
} 
-(id)initWithTitle:(NSString *)title message:(NSString *)message{ 
    if ((self = [super initWithTitle:title message:message delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil])){ 
    } 
    return self; 
} 
- (void)setFrame:(CGRect)rect { 
    // Called multiple times, 4 of those times count, so to reduce height by 40 
    rect.size.height -= 10; 
    self.center = self.superview.center; 
    [super setFrame:rect]; 
} 
@end 
bu basit UIAlertView alt sınıf ile

ve bir kapak için UIView alt sınıf, siz sadece yaptığınız gibi kullanabilirsiniz standart bir UIAlertView. böylece gibi:

NoButtonAlertView *alert = [[NoButtonAlertView alloc] initWithTitle:@"Hello" message:@"I am the very model of a modern major general; I'm information, vegitable, animal, and mineral."]; 
[alert show]; 

verim Will:

Custom AlertView

+1

Um, amacım karmaşık ve uzun kodlardan oluşan bir görünüm yapmak veya kullanmak değildir. Bu iToast gerçekten harika, ama daha az kod ile böyle bir özellik yapmak mümkün olup olmadığını merak ediyorum? Bu bağlantıyı bizimle paylaştığınız için teşekkür ederiz. – wagashi

+0

bu, ölçülebilir derecede yardımcı oldu! .m: - (void) setFrame: (CGRect) rect { \t // [süper setFrame: CGRectMake (0, 0, rect.size.width, 300)] ekledim; \t \t [süper setFrame: CGRectMake (0, 0, 100, 100)]; \t \t // kod aşağısı, UIAlertView'ın ortalanmasını sağlar. \t //self.center = CGPointMake (320/2, 480/2); \t \t // benim özel cgpointmake \t self.center = CGPointMake (200, 400); } – wagashi

+0

Evet, soruma cevap verdiniz. Ancak "uyarı" mesajıma fazla bilgi koymayacağım, bu yüzden CGRectMake 0,0,100,100 benim durumumda mükemmel. UIAlertView içindeki yazı tipi boyutunu değiştirmek mümkün mü acaba? – wagashi

3

UIAlertView görüntüleyicinizi görüntü denetleyicinize (veya pencereye) ekledikten sonra tam ekran boyutuna sahip yeni boş UIView ekleyin. UITapGestureRecognizer

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
[view addGestureRecognizer:singleTap]; 
[singleTap release]; 

Şimdi handleSingleTap yönteminde sen UIAlertView sayabilirsiniz ve pencere

aslında iOS'de bir "Tost" yeniden oluşturmaya çalışıyorlar gibi geliyor
-(void)handleSingleTap:(UITapGestureRecognizer *)sender{ 
    [myAlert dismissWithClickedButtonIndex:0 animated:YES]; 
    [view removeFromSuperView]; 
} 
+1

hiçbir metin veya resim –

+0

Evet, iyi fikir ile özel bir UIButton eklemek istiyorum. Birkaç satır kod yazmaktan kurtarır. Her durumda dokunma eylemini işlemeniz gerekir. – beryllium

+1

Merak etme, neden bir "UIAlertView" kullanıyor? Tam ekran 'UIButton'unu, beğendiğiniz metin ve arka plan rengiyle (veya meraklı olursanız) diğer tüm görünümlerin önüne koyun. – XJones

İlgili konular