2016-01-06 41 views
6

Uygulamamda, basit UIView'leri sınıflandırarak UIView aracılığıyla bir görüşme yaptım. Ancak, UIVisualEffectView kullanarak aynı şeyi yapmaya çalışırsam, bunu yapamıyorum. UIView olduğunu yoluyla olsa bile, ben yeşil UIView yerine UIVisualEffectView kullandığınızdaUIVisualEffectView üzerinde şeffaf bir kesim nasıl yapılır?

enter image description here

, ben UIView görüyorum neden göremiyorum: Burada

Ben UIView normale kullanarak yapabilir buyum UIVisualEffectView'a subview olarak eklendi.

enter image description here

Kodu:

- (void)drawRect:(CGRect)rect { //this is same for the UIVIew and for the UIVisualEffectView 
    [super drawRect:rect]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    // Clear any existing drawing on this view 
    // Remove this if the hole never changes on redraws of the UIView 
    CGContextClearRect(context, self.bounds); 

    // Create a path around the entire view 
    UIBezierPath *clipPath = [UIBezierPath bezierPathWithRect:self.bounds]; 

    // Your transparent window. This is for reference, but set this either as a property of the class or some other way 
    CGRect transparentFrame; 
    // Add the transparent window 
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:transparentFrame cornerRadius:5.0f]; 
    [clipPath appendPath:path]; 

    // NOTE: If you want to add more holes, simply create another UIBezierPath and call [clipPath appendPath:anotherPath]; 

    // This sets the algorithm used to determine what gets filled and what doesn't 
    clipPath.usesEvenOddFillRule = YES; 
    // Add the clipping to the graphics context 
    [clipPath addClip]; 

    // set your color 
    UIColor *tintColor = [UIColor greenColor]; 

    // (optional) set transparency alpha 
    CGContextSetAlpha(context, 0.7f); 
    // tell the color to be a fill color 
    [tintColor setFill]; 
    // fill the path 
    [clipPath fill]; 
} 

Soru: Bu UIVisualEffectView ile işe yaramadı neden? senin ViewController.h küresel değişkenler aşağıdaki

+0

Merhaba Teja, Bu yazıda bahsedilen işlevselliği başarabilir misiniz. Eğer öyleyse, bana yardımcı olabilir veya aşağıdaki yazıya verilen kod için bazı ince ayarlar önerebilirsiniz. http://stackoverflow.com/questions/39165751/circle-masking-for-image-cropping-in-ios?noredirect=1#comment65676404_39165751 –

+0

@sree_iphonedev bilgisayar başında olduğumda yapacağım! –

+0

Sonunda çözdünüz mü? –

cevap

0

Ekleme sizin ViewController.m dosya-

-(void)addOverlay:(CGRect)rect{ 

    float x = rect.origin.x; 
    float y = rect.origin.y; 
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height) cornerRadius:0]; 
    UIBezierPath *circlePath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(x, y, rect.size.width, rect.size.height) cornerRadius:5]; 

    [path appendPath:circlePath]; 
    [path setUsesEvenOddFillRule:YES]; 

    [self removeOverlay]; 
    overlayView = [[UIVisualEffectView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height+64)]; 
    overlayView.backgroundColor = [UIColor clearColor]; 
    [self.view addSubview:overlayView]; 

    fillLayer = [CAShapeLayer layer]; 
    fillLayer.path = path.CGPath; 

    fillLayer.fillRule = kCAFillRuleEvenOdd; 

    fillLayer.fillColor = [UIColor colorWithRed:78/255.0 green:103/255.0 blue:135/255.0 alpha:1.0].CGColor; 
    fillLayer.opacity = 0.85; 
    [[UIApplication sharedApplication].keyWindow.layer addSublayer:fillLayer]; 

} 

-(void)removeOverlay{ 
    [overlayView removeFromSuperview]; 
    [fillLayer removeFromSuperlayer]; 
} 

yılında yöntemlerle aşağıdaki

CAShapeLayer *fillLayer; 
UIVisualEffectView *overlayView; 

Ekle dosya ve olarak diyoruz -

[self addOverlay:rect]; 
İlgili konular