سؤال

أحاول إنشاء فئة فرعية UIVIEW ("GradientView") والتي ستملأ نفسها بتدرج من مختلف الألوان. لقد قمت بتنفيذها عن طريق إضافة CagradientLayer كطبق فرعي لطبقة Uiview.

بدا الأمر جيدًا ، ولكن عندما تم تدوير الشاشة ، لم يتم تغيير حجم طبقة التدرج. بعد عدم حظك في العثور على خاصية منطقية على الطبقة للتبديل ، أتجاوز LayoutSubviews في GradientView.

-(void)layoutSubviews {
    self.gradientLayer.frame = self.bounds;
}

هذا يعمل ، لكن الأشياء التي تقف وراء GradientView لا تزال مرئية أثناء الرسوم المتحركة لدوران الجهاز. ما هي أسهل طريقة لـ "التلقائي" الذي تتطابق مع CagradientLayer لتطابق حدود طبقة الوالدين بحيث تكون الرسوم المتحركة سلسة (مثل Uiview Autoresization)؟

هل كانت مفيدة؟

المحلول

ربما يمكنك الابتعاد عن تحديد طريقة +طبقة على Uiview مخصص ...

@implementation MyGradientView
+(Class) layerClass {
    return [CAGradientLayer class];
}
@end

يمكنك تهيئة الطبقة في وحدة التحكم في ViewDidload () (أو في أي مكان) ، شيء مثل ...

-(void)viewDidLoad {
    [super viewDidLoad];
    [(CAGradientLayer*)[mMyGradientViewInstance layer] setColors:nil];
}

نصائح أخرى

أود:

  1. زيادة حجم وجهة نظرك إلى أقصى من كل البعد في رمز willrotatetointerfaceorient. (على سبيل المثال للحصول على 320 × 480 iPhone - اضبط DIMS على 480 × 480).

  2. قم بتعيين الحدود وفقًا للعرض المقيد حديثًا في دالة didrotateFromInterfaceorientation.

يجب أن يجعل هذا العرض كبيرًا بما يكفي بحيث بغض النظر عن كيفية توجيهه أثناء الرسوم المتحركة ، فسيغطي الشاشة بأكملها. لن يكون "سلسًا" - لأنه يجب تدوير التدرج ، لكن على الأقل لن ترى خلف الطبقة في منتصف الدوران.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    CGRect b;

    if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation))b = CGRectMake(0, 0, 480, 320);
    else b = CGRectMake(0, 0, 320, 480);    

    [CATransaction begin];
    [CATransaction setValue:[NSNumber numberWithFloat:duration] forKey:kCATransactionAnimationDuration];
    [self.view.layer setBounds:b];
    [CATransaction commit];

}

لاحظ أن إرجاع CagradientLayer حيث تعمل فئة الطبقة فقط إذا قمت بتعيين لون الخلفية الشفافة. ستحتاج إلى ضبط لون خلفية الطبقة إذا كنت بحاجة إلى لون غير شفاف.

في حالتي هذا العمل:

[[[view.layer sublayers] objectAtIndex:gradientIndex] setFrame:view.bounds];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top