2017-11-04 347 views
5

Ekranda görüntülenen tüm görünümleri kapsayacak bir bindirme oluşturuyorum. Bu bindirme hep iterek veya sunulması, hatta dava rootViewController değişikliklere görünür.UIAppDelegate öğesinin bir kaplama ile kapsanması penceresi, kullanıcı görüntülendiğinde UIActivityViewController uzantısına dokunamadığında

Benim fikrim

  • UIWindow bir alt sınıfıdır CustomWindow oluştur olduğunu. Bundan sonra CustomWindow numaralı UIApplication numaralı window'un yerine yeni pencerem için yeni bir rootViewController oluşturun.
  • CustomWindow'da, bir overlay (bir UIView) var. Overlay görünümünün altında geçmesine edilecek alfa ve overlay her olay açık gri bir renge sahiptir.
  • CustomWindow yeni bir alt görünüm eklediğinde, ön tarafa overlay getireceğim. Bu overlay her durumda en üstte yer alacağından emin olun bu. sunulması veya rootViewController değişen iterek bile

CustomWindow

@implementation CustomWindow 

- (instancetype)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 

    if (self) { 
    _overlay = [[UIView alloc] initWithFrame:self.bounds]; 
    _overlay.userInteractionEnabled = NO; 
    _overlay.backgroundColor = [UIColor lightGrayColor]; 
    _overlay.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    [self addSubview:_overlay]; 
    } 

    return self; 
} 

- (void)didAddSubview:(UIView *)subview { 
    [super didAddSubview:subview]; 

    [self bringSubviewToFront:_overlay]; 
} 

@end 

Her şey her durumda çalışıyor.

Sorun

Ama bir UIActivityViewController gösterdiğinde, ben UIActivityViewController görüntülenir uzantılarla tıklayın olamaz.

Sihirli

  • i dışarıda UIActivityViewController ait tıklayın ya Cancel Button tıklayın, UIActivityViewController normalde reddedilmiştir.

  • overlay'un rengini clearColor olarak değiştirirseniz, bu da iyi çalışır.

Sorum i penceresinde overlay varsa ve overlay bir renge sahip olduğunda ben uzantılarını dokunabilir nasıl

  • mı?

  • Yapamam, kimse bunun neden olduğunu söyleyebilir mi? Bir belgenin nedenini belirtebileceğiniz zaman mükemmel.

bu i UIActivityViewController başlatmak veya yolu i UIActivityViewController gösterdiğine ilgili değildir eminim.

Daha fazla ayrıntı ve daha kolay için, burada bir debug repo oluşturdum. İsterseniz hata ayıklamak için kontrol edebilirsiniz.

DAHA ben Android bu soruna bir problem oldukça benzer bulundu. Ama emin değilim çünkü Apple'dan herhangi bir resmi belge görmedim. Bir şey daha, rengi clearColor'a değiştirirken dokunmayı etkileyebilir. Yani aslında, aynı olduklarını sanmıyorum.

+0

Kodumu sınamak için benim Mac'umda değilim ama sadece bir fikrim var. SetOpaque yöntemini denediniz mi? –

+0

@ToughGuy Öneriniz için teşekkürler, ancak setOpaque bu durumda bana yardımcı olmaz. Yavaşça, kodumu test edebileceğiniz zaman sizden başka bir soru bekleyebilirim. – trungduc

+0

Gri ​​Kutuyu küçültmek için düğmelerin yarı görünür olmasını sağlamaya çalıştım. Temel olarak ActivityViewController dışındaki herhangi bir görünüme dokunmak, bir yanıtlayıcı olayı verir. –

cevap

3

Bu, hiyerarşide bir UIRemoveView (özel) kaynaklanmaktadır. En iyi şekilde belirleyebileceğim gibi, uygulamanız etkinlikleri doğrudan uzak görünümlere yönlendiremez. Bunun, paylaşım iletişim kutusunu sunmanızı ve kullanıcının istemediği bir harici işlem yapmak için otomatik olarak bir dokunma olayı göndermenizi engellemek için bir güvenlik önlemi olduğundan şüpheleniyorum. Uzaktan görünümler, uygulamanızın işleminde çalışmaz. "Kopyala" düğmesi bir XPC bağlantısıyla etkileşime girer.

Tüm bunlar, uzak görünüm görünümlerinizden biri tarafından ele alındığında, bununla etkileşimde bulunmanın (en azından bulduğum) bir yolu olmadığı anlamına gelir. Onu kapsamadığına emin olmalısın.

Aslında bunu yapmak basittir. Uzaktan görünümü tutan şey, UITransitionView olarak adlandırılır ve büyük olasılıkla ya da içermemesi gereken diğer işletim sistemi düzeyinde şeyler için kullanılır.

- (void)didAddSubview:(UIView *)subview { 
    [super didAddSubview:subview]; 

    if ([subview isKindOfClass:NSClassFromString(@"UITransitionView")]) { 
     // To raise it above your overlay; 
     // otherwise it's immediately above the view controller (below the overlay) 
     [self bringSubviewToFront:subview]; 
    } else { 
     [self bringSubviewToFront:self.overlay]; 
    } 
} 

Ama .... Bu kodunuzda yaklaşık UITransitionView konuşmak gerektiren: Yani yok. Bu hem kırılgan hem de özel API'lerin yasaklanmış kullanımıdır. Aksi halde, UIActivityViewController isteklerinizi, tamamlanana kadar pencereyi görüntülemeyecek şekilde bildiren bir çağrı/bildirim ile sarmanız gerekecektir (tamamlama işleyicisinde bunu silmek zorunda kalacaksınız).

+0

Dediğiniz gibi ** uzaktan görünüm görünümlerinizden biri tarafından karşılanıyorsa, onunla etkileşimde bulunmanın bir yolu yoktur (en azından bulduğum şey) **, ama değiştiğimde clearColor 'için overlay' rengi. Uzantı öğelerine normal olarak dokunabilirim. Sence burada yanlış bir şey mi var? – trungduc

+0

Açık cevabınız için çok teşekkür ederim! – trungduc

+0

Görünmez görünümler dokunma olaylarını yakalamadığından, görüşünüzün gidişinden ziyade dokunmanın doğrudan uzak görünüme iletildiğinden şüpheleniyorum. –