2012-06-25 15 views
10
self.myPath=[UIBezierPath bezierPathWithArcCenter:center 
              radius:200 
             startAngle:0 
             endAngle:180 
             clockwise:YES]; 

ters yolunu (bu kadar bazı googling yardımıyla çalışan kalkmak başardı ..)bir UIBezierPath

Ben bu yolu var Get Nasıl. Şimdi bu yolun tersini doldurmak istiyorum, bu yüzden bu bölümü terk etmek ve her şeyi doldurmak. Kodlamada bana yardımcı olan var mı? Bu konuda fazla bilgim yok.

> SORUN

enter image description here

Cemal Yanıt kullandıktan sonra gösteren bölge, daha önce sadece kırmızı inmeli bir çevre gösterdi.

> YENİ DÜZENLEME

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.backgroundColor = [UIColor whiteColor]; 
     self.punchedOutPath = 
     [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 400, 400)]; 
     self.fillColor = [UIColor redColor]; 
     self.alpha = 0.8; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect 
{ 
    [[self fillColor] set]; 
    UIRectFill(rect); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut); 

    [[self punchedOutPath] fill]; 

    CGContextSetBlendMode(ctx, kCGBlendModeNormal); 
} 

enter image description here

+0

tam bir daire veya bir açık dairesel şekil olacak mı? Ayrıca, ne beklediğinizin bir görüntüsünü sağlayabilir misiniz? Güzel olmak zorunda değil ama insanların size ne yapmaları gerektiğini anlamasına yardımcı olacak, böylece size yardımcı olabilirler. –

+0

tamamlandı .. sadece ben bu ikinciyi – Shubhank

cevap

2

sizin için iki çözüm var.

  1. Bu yolu bir CALayer üzerinde çizin. Ve bu CALayer'u gerçek CALayer için bir maske katmanı olarak kullanın.

  2. Ark eklemeden önce çerçevenizin boyutları ile bir dikdörtgen çizin.

    UIBezierPath *path = [UIBezierPath bezierPathWithRect:view.frame]; 
    [path addArcWithCenter:center 
           radius:200 
          startAngle:0 
           endAngle:2*M_PI 
          clockwise:YES]; 
    

Ben ikinci çözümü kullanmak. :)

+2

yaptım sağlamaya çalışıyordum İkinci çözüm daha iyi, ark saat yönünün tersine eklenmesi gerekiyordu, bu yüzden sınırladığı alan [sıfırdan olmayan sayı kuralı] tarafından hariç tutuluyor (https: //developer.apple.com/library/ios/documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_paths/dq_paths.html#//apple_ref/doc/uid/TP30001066-CH211-TPXREF106) (dikdörtgen, saat yönünde eklenir) . –

+0

bu benim için çalışmıyor oldukça garip bir sonuç alıyorum ... bu soruyu ekledim..kindly see..thanks – Shubhank

+1

EndAngle radyan (derece değil) olması gerekiyor. 360 ° daire istiyorsun, yani 2pi ya da 6.283. Bunu '2 * M_PI' olarak yazabilirsiniz. –

12

İşte yolu tersine çevirmeyi gerektirmeyen bir alternatif.

clipped out

Diyelim ki beyaz bölgenin% 75 alfa ile [UIColor whiteColor] olmak istiyorum diyelim:

Sen aslında "dışarı klibi" istediğiniz bir bakış bir kısmını var. İşte hızlı bir şekilde:

  • Yeni bir UIView alt sınıf oluşturun.

    @property (retain) UIColor *fillColor; 
    @property (retain) UIBezierPath *punchedOutPath; 
    
  • Bunu yapmak için onun -drawRect: yöntemini geçersiz:

  • Bu görüş iki özelliği vardır

    - (void)drawRect:(CGRect)rect { 
        [[self fillColor] set]; 
        UIRectFill(rect); 
    
        CGContextRef ctx = UIGraphicsGetCurrentContext(); 
        CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut); 
    
        [[self punchedOutPath] fill]; 
    
        CGContextSetBlendMode(ctx, kCGBlendModeNormal); 
    } 
    

burada bir uyarı var: görünümünün fillColor gerekir değil, alfa bileşenini içerir. Bu durumda, sadece [UIColor whiteColor] olmasını istersiniz. Ardından, [myView setAlpha:0.75] numaralı telefonu arayarak alfa bitini kendiniz uygularsınız.

Neler oluyor: Bu, "Hedef Çıkışı" adlı bir karışım modunu kullanıyor. Matematiksel olarak R = D*(1 - Sa) olarak tanımlanmıştır, ancak layman'ın terimleriyle "Hedef imajın opak olduğu ancak kaynak görüntünün saydam olduğu ve başka yerlerde şeffaf olduğu yerde hedef resim" anlamına gelir.

Yani bezier yolu opak nerede olacağını sonra yeni şeyler (bezier yolunun yani dışında) şeffaftır yerde (bağlamda zaten ne yani) hedef kullanacağız ve oluyor, bu belirler şeffaflaşacak. Ancak, hedef malzeme zaten opak olmalıdır. Eğer opak değilse, karıştırma yapmak istediğiniz şeyi yapmaz. Bu nedenle, bir opak UIColor sağlamanız ve ardından doğrudan görünümü ile istediğiniz saydamlığı yapmanız gerekir.

  • pencere
  • fillColor
  • punchedOutPath kenarlarından içeri giriyorsa 10 puan var bir oval olan beyaz bir [UIColor greenColor] geçmişe sahip:

    Bu şartlar ile, bu kendim koştu görünümün

    enter image description here

    iç yeşil saf ve dış yarı saydam katmanına sahip:

  • görünümü bir alpha yukarıdaki kod ile 0.75

ait sahiptir, bu alın. senin kaplama bir görüntü ise


Güncelleme

, o zaman yeni bir imaj oluşturmak gerekir. Ama prensip aynıdır:

UIImage* ImageByPunchingPathOutOfImage(UIImage *image, UIBezierPath *path) { 
    UIGraphicsBeginImageContextWithOptions([image size], YES, [image scale]); 

    [image drawAtPoint:CGPointZero]; 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut); 
    [path fill]; 


    UIImage *final = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return final; 
} 

Daha sonra bu fonksiyonun sonucu alıp bir UIImageView koydu olacaktır.

+0

projenizi bana verebilecek misiniz .. ?? Lütfen..! Çalıştığım bir kodun olması daha iyi olurdu ... aksi halde seninle sorularımı temizlemek zorundayım ... ve bu senin için can sıkıcı olabilir! – Shubhank

+0

@shubhank cevapta ihtiyacınız olan her şeyi açıklıyor –

+0

merhaba ... yeni düzenlememi que'lere bakabilirsin ... metodunu denedim ... benim görüntümün arka planını beyaz renk olarak ayarla ... siyah renk ... bana yardım edebilir misin ... bu beyaz olmalıydı ... teşekkürler – Shubhank

14

bezierPathByReversingPath'u kullanın. Belgelerden (yalnızca iOS 6.0+):

Geçerli yolun ters çevrilmiş içeriğine sahip yeni bir bezier yolu nesnesi oluşturur ve döndürür. senin yolunu tersine çevirmek için

yüzden, sadece ediyorum:

UIBezierPath* aPath = [UIBezierPath bezierPathWithArcCenter:center 
                radius:200 
               startAngle:0 
                endAngle:180 
                clockwise:YES]; 
self.myPath = [aPath bezierPathByReversingPath]; 
2
Sen görünümü denetleyicisi içine tek ekran app içine koyabilirsiniz

: Bir sarı arka plan görüntüsünü ve üzerinde mavi bir katman yapacak Bir maske ile kesilmiş oval bir bölgeye sahiptir.

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

    // create a yellow background 
    UIView *bg = [[UIView alloc] initWithFrame:self.view.bounds]; 
    bg.backgroundColor = [UIColor yellowColor]; 
    [self.view addSubview:bg];  

    // create the mask that will be applied to the layer on top of the 
    // yellow background 
    CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
    maskLayer.fillRule = kCAFillRuleEvenOdd; 
    maskLayer.frame = self.view.frame; 

    // create the paths that define the mask 
    UIBezierPath *maskLayerPath = [UIBezierPath bezierPath]; 
    [maskLayerPath appendPath:[UIBezierPath bezierPathWithRect:CGRectInset(self.view.bounds, 20, 20)]]; 
    // here you can play around with paths :) 
// [maskLayerPath appendPath:[UIBezierPath bezierPathWithOvalInRect:(CGRect){{80, 80}, {140, 190}}]]; 
    [maskLayerPath appendPath:[UIBezierPath bezierPathWithOvalInRect:(CGRect){{100, 100}, {100, 150}}]]; 
    maskLayer.path = maskLayerPath.CGPath; 

    // create the layer on top of the yellow background 
    CALayer *imageLayer = [CALayer layer]; 
    imageLayer.frame = self.view.layer.bounds; 
    imageLayer.backgroundColor = [[UIColor blueColor] CGColor]; 

    // apply the mask to the layer 
    imageLayer.mask = maskLayer; 
    [self.view.layer addSublayer:imageLayer]; 

} 

bu da bu soruya cevap olabilir: UIBezierPath Subtract Path

+0

Ne yaptığınızı ve nedenini açıklar mısınız? Sadece sordu ve cevap arayan diğer insanlar, ne cevap verdiğini anlıyorlar. – Manuel

+0

"Oval bölge" benim için kareyi gösteriyor ... – zakdances

+0

Garip, neden [UIBezierPath bezierPathWithOvalInRect:] bir oval çizemedi? Tam olarak bu kodu kopyalayıp boş bir tek ekran projesine yapıştırdınız mı? – user511

İlgili konular