خلق اليسار زر السهم (مثل UINavigationBar "العودة" style) على UIToolbar

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

سؤال

أحب أن إنشاء "العودة" اليسار السهم-مدي زر في UIToolbar.

بقدر ما أستطيع أن أقول, الطريقة الوحيدة للحصول على واحدة من هذه هو ترك UINavigationController في الإعدادات الافتراضية ويستخدم واحد على اليسار شريط البند.ولكن ليس هناك طريقة يمكنني العثور على خلق واحد كما UIBarButtonItem, لذلك أنا لا يمكن أن تجعل واحدة في معيار UIToolbar, على الرغم من أنهم مشابهة جدا UINavigationBars.

لا يمكن إنشاء يدويا مع زر الصور, ولكن أنا لا يمكن العثور على مصدر الصور في أي مكان.لديهم قناة ألفا حواف ، حتى screenshotting والقطع لن تحصل على تنوعا للغاية النتائج.

أي أفكار ما وراء screenshotting كل حجم ولون مخطط أنوي استخدامها ؟

تحديث: يرجى التوقف عن التهرب من السؤال ، مما يشير إلى أنه لا ينبغي أن يسأل هذا و يجب أن يكون استخدام UINavigationBar.بلدي التطبيق هو Instapaper برو.فإنه يظهر فقط أسفل شريط الأدوات (لتوفير مساحة وتعظيم للقراءة منطقة المحتوى) ، وأود أن وضع اليسرى على شكل السهم مرة أخرى على زر في الجزء السفلي.

تقول لي أنني لا يجب عليك فعل هذا لا إجابة وبالتأكيد لا يستحق فضله.

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

المحلول

ولقد استخدمت مديرية الأمن العام التالي أنني المستمدة من http://www.teehanlax.com / بلوق /؟ p = 447

http://www.chrisandtennille.com/pictures/backbutton.psd

وبعد ذلك فقط خلق UIView المخصصة التي تستخدم في الممتلكات customView في هذا البند شريط الأدوات.

ويعمل بشكل جيد بالنسبة لي.


تحرير: <وأ href = "https://stackoverflow.com/questions/227078/creating-a-left-arrow-button-like-uinavigationbars-back-style-on-a -uitoolba / 3985773 # comment12106974_3985773 "> كما أشار <م> PrairieHippo أو صورة مخصصة <م> maralbjo جدت أن استخدام ما يلي، رمز بسيط فعل خدعة (يتطلب في حزمة ) ينبغي أن يقترن هذا الجواب. حتى هنا هو رمز إضافية:

// Creates a back button instead of default behaviour (displaying title of previous screen)
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"]
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(backAction)];

tipsDetailViewController.navigationItem.leftBarButtonItem = backButton;
[backButton release];

نصائح أخرى

أسلوب يونيكود

واعتقد انه من الاسهل بكثير لمجرد استخدام حرف unicode لانجاز هذه المهمة. يمكنك أن تبحث من خلال السهام من قبل غوغلينغ إما المثلثات يونيكود أو < وأ href = "http://www.fileformat.info/info/unicode/block/arrows/list.htm" يختلط = "نوفولو noreferrer"> الأسهم يونيكود . بدءا من نظام التشغيل iOS6 أبل غيرت الطابع أن يكون رمز تعبيري مع الحدود. لتعطيل الحدود I إضافة 0xFE0E يونيكود الاختلاف محدد .

NSString *backArrowString = @"\U000025C0\U0000FE0E"; //BLACK LEFT-POINTING TRIANGLE PLUS VARIATION SELECTOR

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:backArrowString style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.leftButtonItem = backBarButtonItem;

وكتلة متاحة فقط للعرض. وسوف تعمل في أي الزر الذي يقبل NSString.

للحصول على قائمة كاملة من الأحرف بحث Google للحرف Unicode وماذا تريد. هنا هو دخول ل الأسود اليسار مشيرا المثلث .

نتائج

تحذير: هناك تقارير تفيد بأن هذا لن يعمل على دائرة الرقابة الداخلية 6.هذه قد تعمل فقط على الإصدارات القديمة من نظام التشغيل.ومن الواضح أن واحدة على الأقل ديف كان التطبيق رفض استخدام هذه الحيلة (انظر الملاحظات).استخدام على مسؤوليتك الخاصة.باستخدام صورة (انظر الإجابة أعلاه) قد يكون أكثر أمانا الحل.

هذا يمكن أن يتم دون إضافة الصور الخاصة بك باستخدام ملفات sekr1t زر نوع 101 للحصول على الشكل الصحيح.بالنسبة لي كان خدعة معرفة أن أتمكن من استخدام initWithCustomView لخلق BarButtonItem.أنا شخصيا بحاجة إلى هذا دينامية الناف بار بدلا من toolbar, لكني اختبرت ذلك مع شريط الأدوات و الكود هو نفسه تقريبا:

// create button
UIButton* backButton = [UIButton buttonWithType:101]; // left-pointing shape!
[backButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
[backButton setTitle:@"Back" forState:UIControlStateNormal];

// create button item -- possible because UIButton subclasses UIView!
UIBarButtonItem* backItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];

// add to toolbar, or to a navbar (you should only have one of these!)
[toolbar setItems:[NSArray arrayWithObject:backItem]];
navItem.leftBarButtonItem = backItem;

إذا كنت تفعل هذا على شريط أدوات سيكون لديك على قرص كيفية تعيين العناصر ، ولكن هذا يعتمد على بقية التعليمات البرمجية الخاصة بك و تركت ذلك باعتبارها ممارسة للقارئ.:P هذا النموذج عملت بالنسبة لي (تجميع وتشغيل).

بلاه بلاه قراءة HIG, لا تستخدم ميزات لا يحملون وثائق ، كل ذلك.هناك ستة فقط دعم أنواع زر و هذا ليس واحد منهم.

enter image description here

أولا عليك أن تجد صورة على الزر مرة أخرى.أنا استخدم التطبيق لطيف يسمى النازع الذي يستخرج جميع الرسومات من اي فون.في iOS7 تمكنت من استرداد الصورة يسمى UINavigationBarBackIndicatorDefault وكان في اللون الأسود ، منذ أن كنت في حاجة إلى لون أحمر تغيير اللون إلى الأحمر باستخدام Gimp.

تحرير:

كما ذكر من قبل btate في تعليق له ، هناك حاجة إلى تغيير لون مع محرر الصور.التعليمة البرمجية التالية ينبغي أن تفعل خدعة:

imageView.tint = [UIColor redColor];
imageView.image = [[UIImage imageNamed:@"UINavigationBarBackIndicatorDefault"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

ثم أنا خلقت عرض الذي يحتوي على imageView مع ذلك السهم التسمية مع نص مخصص على أعلى عرض علي زر مع هذا العمل.ثم أضفت الرسوم المتحركة البسيطة (يتلاشى الترجمة).

التعليمة البرمجية التالية يحاكي سلوك الزر مرة أخرى بما في ذلك الرسوم المتحركة.

-(void)viewWillAppear:(BOOL)animated{
        UIImageView *imageView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBarBackIndicatorDefault"]];
        [imageView setTintColor:[UIColor redColor]];
        UILabel *label=[[UILabel alloc] init];
        [label setTextColor:[UIColor redColor]];
        [label setText:@"Blog"];
        [label sizeToFit];

        int space=6;
        label.frame=CGRectMake(imageView.frame.origin.x+imageView.frame.size.width+space, label.frame.origin.y, label.frame.size.width, label.frame.size.height);
        UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0, label.frame.size.width+imageView.frame.size.width+space, imageView.frame.size.height)];

        view.bounds=CGRectMake(view.bounds.origin.x+8, view.bounds.origin.y-1, view.bounds.size.width, view.bounds.size.height);
        [view addSubview:imageView];
        [view addSubview:label];

        UIButton *button=[[UIButton alloc] initWithFrame:view.frame];
        [button addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];
        [view addSubview:button];

        [UIView animateWithDuration:0.33 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
            label.alpha = 0.0;
            CGRect orig=label.frame;
            label.frame=CGRectMake(label.frame.origin.x+25, label.frame.origin.y, label.frame.size.width, label.frame.size.height);
            label.alpha = 1.0;
            label.frame=orig;
        } completion:nil];

        UIBarButtonItem *backButton =[[UIBarButtonItem alloc] initWithCustomView:view];
}

- (void) handleBack:(id)sender{
}

تحرير:

بدلا من إضافة زر في رأيي النهج الأفضل هو استخدام لفتة التعرف.

UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleBack:)];
[view addGestureRecognizer:tap];
[view setUserInteractionEnabled:YES];

ولست متأكدا إذا كان ذلك العمل، ولكن قد تتمكن من محاولة خلق UINavigationController مع الإعدادات الافتراضية لإنشاء زر، والعثور على زر في التسلسل الهرمي subview وحدة تحكم الملاحة والاتصال removeFromSuperview على ذلك، تدمير وحدة تحكم الملاحة، و قم بإضافة زر باعتباره subview من شريط الأدوات. قد تحتاج أيضا إلى retain والزر قبل استدعاء removeFromSuperview (ثم release بعد إضافته كما subview من شريط الأدوات) لتجنب ذلك يتم deallocated أثناء العملية.

لجعل UIButton مع السهم قريب جدا (أنا لست مصمم ;) إلى دائرة الرقابة الداخلية 7 نظام السهم مرة أخرى:

القياسية:

Standard system back arrow

أبل SD النيو القوطية

Apple SD Gothic Neo < character

في كسكودي:

  • التركيز على العنوان قيمة الحقل الزر (أو أي عرض/التحكم مع محتوى النص)
  • فتح تحرير -> أحرف خاصة
  • حدد قوسين المجموعة وانقر نقرا مزدوجا فوق '<'حرف
  • تغيير الخط إلى:أبل SD النيو القوطية العادية مع الحجم المطلوب (مثلا ، 20)
  • تغيير الألوان كما تريد

المرجع @staticVoidMan الجواب إلى الوراء-مثل السهم على دائرة الرقابة الداخلية 7

إذا كنت لا تريد عناء مع ملفات الصور، ويمكن استخلاص شكل السهم في فئة فرعية UIView مع التعليمات البرمجية التالية:

- (void)drawRect:(CGRect)rect {
    float width = rect.size.width;
    float height = rect.size.height;
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextBeginPath(context);
    CGContextMoveToPoint(context, width * 5.0/6.0, height * 0.0/10.0);
    CGContextAddLineToPoint(context, width * 0.0/6.0, height * 5.0/10.0);
    CGContextAddLineToPoint(context, width * 5.0/6.0, height * 10.0/10.0);
    CGContextAddLineToPoint(context, width * 6.0/6.0, height * 9.0/10.0);
    CGContextAddLineToPoint(context, width * 2.0/6.0, height * 5.0/10.0);
    CGContextAddLineToPoint(context, width * 6.0/6.0, height * 1.0/10.0);
    CGContextClosePath(context);

    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
    CGContextFillPath(context);
}

وحيث يرى السهم يتناسب مع بعرض 6.0 وارتفاع 10.0

    self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem;

ويعمل بالنسبة لي. أنا استخدم هذا عندما أتيحت لي أكثر من علامات التبويب ثم يمكن أن يصلح على شريط التبويب، وحدة تحكم عرض دفعت من "المزيد" تجاهلت وleftBarButtonItem في viewDidLoad لها.

ويمكنك العثور على مصدر الصور عن طريق استخراج لهم من Other.artwork في UIKit $ {SDKROOT} /System/Library/Frameworks/UIKit.framework/Other.artwork. المجتمع الشعيب لديه بعض أدوات لاستخراج لهم، <وأ href = "http://www.modmyi.com/forums/skinning-themes-discussion/425091-new-iphoneshop-1-22-supports-all-2-2 -artwork.html "يختلط =" نوفولو noreferrer "> هنا . بمجرد استخراج الصور يمكنك كتابة بعض الرموز لإعادة تلوين عند الضرورة وضعه كصورة زر. أم لا يمكنك شحن فعلا شيء من هذا القبيل (منذ كنت التضمين المستمدة الفني) قد يكون قليلا مشبوه، لذلك ربما كنت ترغب في التحدث إلى محام.

والمكتبة Three20 لديه وسيلة للقيام بذلك:

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle: @"Title" style:UIBarButtonItemStylePlain 
                                                                target:self action:@selector(foo)];

  UIColor* darkBlue = RGBCOLOR(109, 132, 162);

  TTShapeStyle* style = [TTShapeStyle styleWithShape:[TTRoundedLeftArrowShape shapeWithRadius:4.5] next:
    [TTShadowStyle styleWithColor:RGBCOLOR(255,255,255) blur:1 offset:CGSizeMake(0, 1) next:
    [TTReflectiveFillStyle styleWithColor:darkBlue next:
    [TTBevelBorderStyle styleWithHighlight:[darkBlue shadow]
                                     shadow:[darkBlue multiplyHue:1 saturation:0.5 value:0.5]
                                      width:1 lightSource:270 next:
    [TTInsetStyle styleWithInset:UIEdgeInsetsMake(0, -1, 0, -1) next:
    [TTBevelBorderStyle styleWithHighlight:nil shadow:RGBACOLOR(0,0,0,0.15)
                                        width:1 lightSource:270 next:nil]]]]]];

  TTView* view = [[[TTView alloc] initWithFrame:CGRectMake(0, 0, 80, 35)] autorelease];
  view.backgroundColor = [UIColor clearColor];
  view.style = style;
  backButton.customView = view;


  self.navigationItem.leftBarButtonItem = backButton;

ولقد وجدت أن استخدام ما يلي، رمز بسيط فعل خدعة (يتطلب صورة مخصصة في حزمة):

// Creates a back button instead of default behaviour (displaying title of previous screen)
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"]
                                                                   style:UIBarButtonItemStyleBordered
                                                                  target:self
                                                                  action:@selector(backAction)];

    tipsDetailViewController.navigationItem.leftBarButtonItem = backButton;
    [backButton release];

وهنا ما انتهى به بعد البحث من خلال كل هذه الحلول وغيرها. ويستخدم بابوا نيو غينيا للمط المستخرج من مخزون الصور UIKit. وبهذه الطريقة يمكنك تعيين النص إلى ما كنت liek

// Generate the background images
UIImage *stretchableBackButton = [[UIImage imageNamed:@"UINavigationBarDefaultBack.png"] stretchableImageWithLeftCapWidth:14 topCapHeight:0];
UIImage *stretchableBackButtonPressed = [[UIImage imageNamed:@"UINavigationBarDefaultBackPressed.png"] stretchableImageWithLeftCapWidth:13 topCapHeight:0];
// Setup the UIButton
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[backButton setBackgroundImage:stretchableBackButton forState:UIControlStateNormal];
[backButton setBackgroundImage:stretchableBackButtonPressed forState:UIControlStateSelected];
NSString *buttonTitle = NSLocalizedString(@"Back", @"Back");
[backButton setTitle:buttonTitle forState:UIControlStateNormal];
[backButton setTitle:buttonTitle forState:UIControlStateSelected];
backButton.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 2, 1); // Tweak the text position
NSInteger width = ([backButton.titleLabel.text sizeWithFont:backButton.titleLabel.font].width + backButton.titleEdgeInsets.right +backButton.titleEdgeInsets.left);
[backButton setFrame:CGRectMake(0, 0, width, 29)];
backButton.titleLabel.font = [UIFont boldSystemFontOfSize:13.0f];
[backButton addTarget:self action:@selector(yourSelector:) forControlEvents:UIControlEventTouchDown];
// Now add the button as a custom UIBarButtonItem
UIBarButtonItem *backButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:backButton] autorelease];
self.navigationItem.leftBarButtonItem = backButtonItem;

فإنه من السهل القيام به مع واجهة البناء في كسكودي 5.x

Result

  • استخدام شريط الأدوات و زر شريط البند من مكتبة الكائنات

    Components

  • في الزر سمات المفتش تحرير صورة القسم مع الخاص بك مرة أخرى على زر صورة

    Attributes inspector

فعلت!

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

ولكن وجدت وسيلة للتغلب على هذه. أنا في الحقيقة مجرد وضع UIView تحت UIButton وتعيين customView لUIBarButtonItem. هنا هو رمز، إذا كان شخص ما يحتاج إليه:

// initialize button and button view
UIButton *backButton = [UIButton buttonWithType:101];
UIView *backButtonView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, backButton.frame.size.width, backButton.frame.size.height)];

[backButton addTarget:self action:@selector(backButtonTouched:) forControlEvents:UIControlEventTouchUpInside];
[backButton setTitle:@"Back" forState:UIControlStateNormal];
[backButtonView addSubview:backButton];

// set buttonview as custom view for bar button item
UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButtonView];
self.navigationItem.leftBarButtonItem = backButtonItem;

// push item to navigationbar items
[self.navigationController.navigationBar setItems:[NSArray arrayWithObject:backButtonItem]];

لخلق صورة لUIToolbar، وجعل بابوا نيو غينيا في الفوتوشوب وأي وقت مضى حيث هناك أي لون تضعه الأبيض، وحيث انها ألفا = 0 ثم فإنه يترك وحده.

ووSDK وضع فعلا هو الحدود حول رمز التي قمت بها وتحويله الأبيض دون الحاجة إلى القيام بأي شيء.

وانظر، هذا هو ما أدليت به في فوتوشوب لزر بلدي إلى الأمام (من الواضح مبادلة حولها لزر الخلفي):

http://twitpic.com/1oanv

وهذا ما بدا وكأنه في واجهة البناء

http://twitpic.com/1oaoa

والحل دون استخدام بابوا نيو غينيا. وبناء على هذه الإجابة SO: <لأ href = "https://stackoverflow.com/questions/6322798/adding-the-little-arrow-to-the-right-side-of-a-cell-in-an-iphone -tableview خلايا "> واضاف ان السهم قليلا إلى الجانب الأيمن من خلية في خلية فون TableView

وفقط التقليب UITableViewCell أفقيا!

UIButton *btnBack = [[UIButton alloc] initWithFrame:CGRectMake(0, 5, 70, 20)];

// Add the disclosure
CGRect frm;
UITableViewCell *disclosure = [[UITableViewCell alloc] init];
disclosure.transform = CGAffineTransformScale(CGAffineTransformIdentity, -1, 1);
frm = self.btnBack.bounds;
disclosure.frame = CGRectMake(frm.origin.x, frm.origin.y, frm.size.width-25, frm.size.height);
disclosure.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
disclosure.userInteractionEnabled = NO;
[self.btnBack addSubview:disclosure];

// Add the label
UILabel *lbl = [[UILabel alloc] init];
frm = CGRectOffset(self.btnBack.bounds, 15, 0);
lbl.frame = frm;
lbl.textAlignment = NSTextAlignmentCenter;
lbl.text = @"BACK";
[self addSubview:lbl];

إذا كنت ترغب في تجنب رسم عليه نفسك، هل يمكن استخدام فئة غير الموثقة: الإنتقال زر مع نمط 1. هذا يمكن، بطبيعة الحال، ووقف التطبيق الخاص بك من اعتمادها ... / جون

حسنا، لم يكن لديك لديك زر مختلف عن كل حجم، يمكنك استخدام [UIImage stretchableImageWithLeftCapWidth:topCapHeight:]، ولكن الشيء الوحيد الذي كنت قد وجدت هي الصور المخصصة.

وكان لي مشكلة مماثلة، ويخرج مكتبة واحدة PButton . وكانت العينة زر التنقل الخلفي مثل زر، والتي يمكن استخدامها في أي مكان تماما مثل زر حسب الطلب.

وشيء من هذا القبيل:

وعلى سبيل المثال في سويفت 3، مع السابقة وزر التالي في أعلى اليمين.

let prevButtonItem = UIBarButtonItem(title: "\u{25C0}", style: .plain, target: self, action: #selector(prevButtonTapped))
let nextButtonItem = UIBarButtonItem(title: "\u{25B6}", style: .plain, target: self, action: #selector(nextButtonTapped))
self.navigationItem.rightBarButtonItems = [nextButtonItem, prevButtonItem]

وسويفت

// create button
    var backButton = UIButton(type: 101)

    // left-pointing shape!
    backButton.addTarget(self, action: #selector(self.backAction), for: .touchUpInside)
    backButton.setTitle("Back", for: .normal)

    // create button item -- possible because UIButton subclasses UIView!
    var backItem = UIBarButtonItem(customView: backButton)

    // add to toolbar, or to a navbar (you should only have one of these!)
    toolbar.items = [backItem]
    navItem.leftBarButtonItem = backItem

وجرب هذا. أنا متأكد من أنك لا تحتاج إلى صورة زر الرجوع للخلف لإنشاء واحد مثل.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(yourSelectorGoesHere:)];
self.navigationItem.backBarButtonItem = backButton;

وهذا كل ما عليك القيام به:)

لماذا تفعلون هذا؟ إذا كنت تريد شيئا يشبه شريط التنقل، استخدم UINavigationBar.

وأشرطة الأدوات لديها النمط البصري محدد المرتبطة بها. المبادئ التوجيهية واجهة الإنسان للدولة اي فون:

<اقتباس فقرة>   

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

وثم يعطي عدة أمثلة البصرية من الرموز مربع تقريبا مع أي نص. وأود أن أحثكم على اتباع HIG في هذا الشأن.

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