صورة خلفية UINavigationBar عبر drawRect - مشكلة تتعلق بالرسوم المتحركة السريعة

StackOverflow https://stackoverflow.com/questions/1619867

سؤال

أقوم بإضافة صورة خلفية مخصصة إلى UINavigationBar الخاص بي عن طريق تجاوز drawRect عبر فئة.

- ( void )drawRect:( CGRect )rect{
    [[UIImage imageNamed:@"navbar.png"] drawInRect:CGRectMake( 0, self.frame.size.height-44, self.frame.size.width, 44 )];
}

يبدو أن هذا الحل يعمل بشكل جيد، حتى تحاول الاستفادة من خاصية navigationitem.prompt.بدلاً من القيام بحركة سلسة لتقديم الموجه، فإنه يفعل ذلك بشكل مفاجئ.

هل هناك أي اقتراحات حول كيفية علاج هذا؟أو طريقة بديلة لوضع صورة الخلفية.

ملاحظة.أحاول تجنب مجرد إضافة صورة خلفية كعرض فرعي بسبب الطريقة التي يتم بها إعادة ترتيب الأشياء عند دفع/فرقعة المشاهدات.وأنا أكره إرسال SubviewToBack في كل طريقة عرض لـ viewDidAppear.

تيا!

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

يحرر:انظر إجابتي hacky أدناه

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

المحلول

"اختراقي" للغاية، ولكن هذا هو أقرب ما يمكنني فعله لفعل ما أريد ...

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

لذا تبدو فئتي الآن هكذا ..

#import "UINavigationBar+custom.h"

#define cornersTag 1

@implementation UINavigationBar (UINavigationBarCategory)

-(void)setCornersIfNeeded{
 UIImageView *corners = (UIImageView*)[self viewWithTag:cornersTag];
 if(!corners){
  UIImage *img = [[UIImage imageNamed:@"navbar_corners.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:0];
  corners = [[[UIImageView alloc] initWithImage:img] autorelease];
  corners.frame = CGRectMake(0, 0, self.frame.size.width, img.size.height);
  corners.tag = cornersTag;
  [self addSubview:corners];
 }
}

- (void)customDrawRect:( CGRect )rect{
 [self customDrawRect:rect];
 [[UIImage imageNamed:@"navbar.png"] drawInRect:rect]; 
 [self setCornersIfNeeded];
}

@end

لمعرفة المزيد عن طريقة swizzling ... http://www.cocoadev.com/index.pl?MethodSwizzlingو طريقة Swizzle على جهاز iPhone

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top