การสร้างปุ่มลูกศรซ้าย (เช่นสไตล์ "ย้อนกลับ" ของ UINavigationBar) บน UIToolbar


290

ฉันชอบที่จะสร้าง "กลับ" UIToolbarลูกศรซ้ายฝาปุ่มใน

เท่าที่ฉันสามารถบอกได้วิธีเดียวที่จะได้รับหนึ่งในนั้นคือออกจากUINavigationControllerการตั้งค่าเริ่มต้นและใช้หนึ่งรายการสำหรับรายการแถบด้านซ้าย แต่ไม่มีวิธีที่ฉันสามารถค้นหาเพื่อสร้างเป็นUIBarButtonItemดังนั้นฉันไม่สามารถสร้างหนึ่งในมาตรฐานUIToolbarแม้ว่าพวกเขาจะคล้ายกันมากกับUINavigationBars

ฉันสามารถสร้างมันด้วยภาพปุ่มด้วยตนเอง แต่ฉันไม่สามารถหาภาพต้นฉบับได้ทุกที่ พวกมันมีขอบอัลฟ่า - ช่องดังนั้นภาพหน้าจอและการตัดจะไม่ได้ผลลัพธ์ที่หลากหลายมากนัก

มีแนวคิดใดที่นอกเหนือจากการสกรีนภาพสำหรับทุกขนาดและชุดสีที่ฉันตั้งใจจะใช้?

ปรับปรุง: STOP UINavigationBarกรุณาหลบคำถามและบอกว่าฉันไม่ควรจะถามนี้และควรจะใช้ แอพของฉันคือ Instapaper Pro มันแสดงเฉพาะแถบเครื่องมือด้านล่าง (เพื่อประหยัดพื้นที่และเพิ่มพื้นที่เนื้อหาที่อ่านได้สูงสุด) และฉันต้องการวางปุ่มย้อนกลับรูปลูกศรซ้ายที่ด้านล่าง

บอกฉันว่าฉันไม่ควรต้องทำสิ่งนี้ไม่ใช่คำตอบและแน่นอนไม่สมควรได้รับรางวัล



คำตอบ:


130

ฉันใช้ psd ต่อไปนี้ที่ฉันได้รับจากhttp://www.teehanlax.com/blog/?p=447

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

ฉันเพิ่งสร้าง UIView แบบกำหนดเองที่ฉันใช้ในคุณสมบัติ customView ของรายการแถบเครื่องมือ

ทำงานได้ดีสำหรับฉัน


แก้ไข: ในฐานะที่เป็นแหลมออกโดย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];

1
PSD ที่ฉันอัปโหลดมีไว้สำหรับแถบเครื่องมือสีดำ ฉันไม่ได้ลองด้วยสีน้ำเงินเพราะแอพของฉันไม่ได้ใช้ แต่จากสิ่งที่ฉันรู้แถบเครื่องมือจะไม่เปลี่ยนสีได้ตามต้องการ คริส
PyjamaSam

1
คุณไม่จำเป็นต้องใช้เครื่องมือพิเศษใด ๆ ในการเปลี่ยนสีผมได้ทำโดยใช้ตัวเลือก 'ปรับสี' ของ Mac Preview
Sushant

1
สามารถสะกดคำนี้ออกมาได้ไหม?
cannyboy

4
psd นี้มีประโยชน์สำหรับระดับหน้าจอ 1.0f เท่านั้น บนหน้าจอเรตินามันจะดูแย่มาก
Daniel Wood

3
อย่าใช้ภาพสำหรับสิ่งนี้เพียงทำอย่างถูกต้อง (ดูคำตอบสำหรับstackoverflow.com/questions/4260238 )
ingh.am

45

วิธีการ Unicode

ฉันคิดว่ามันง่ายกว่ามากแค่ใช้ตัวอักษรยูนิโค้ดเพื่อทำงานให้เสร็จ คุณสามารถมองผ่านลูกศรโดย googling ทั้งUnicode สามเหลี่ยมหรือUnicode ลูกศร เริ่มต้นด้วย iOS6 Apple เปลี่ยนตัวละครให้เป็นตัวละครอิโมจิที่มีเส้นขอบ การปิดใช้งานชายแดนฉันจะเพิ่ม 0xFE0E Unicode เลือกรูปแบบ

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 อักขระและสิ่งที่คุณต้องการ นี่คือรายการสำหรับดำซ้ายชี้สามเหลี่ยม

ผลลัพธ์

ผลลัพธ์


37

คำเตือน:มีรายงานว่าสิ่งนี้จะไม่ทำงานบน iOS 6 ซึ่งอาจใช้ได้กับระบบปฏิบัติการรุ่นเก่ากว่าเท่านั้น เห็นได้ชัดว่าอย่างน้อยหนึ่ง dev มีแอปของพวกเขาปฏิเสธที่จะใช้เคล็ดลับนี้ (ดูความคิดเห็น) ใช้ความเสี่ยงของคุณเอง การใช้ภาพ (ดูคำตอบข้างบน) อาจเป็นวิธีที่ปลอดภัยกว่า

ซึ่งสามารถทำได้โดยไม่ต้องเพิ่มไฟล์ภาพของคุณเองโดยใช้ปุ่ม sekr1t ประเภท 101 เพื่อให้ได้รูปร่างที่ถูกต้อง สำหรับผมเคล็ดลับที่ถูกหาว่าฉันสามารถใช้ในการสร้างinitWithCustomView BarButtonItemฉันต้องการสิ่งนี้เป็นการส่วนตัวสำหรับ navbar แบบไดนามิกมากกว่า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 ตัวอย่างนี้ใช้ได้สำหรับฉัน (รวบรวม & เรียกใช้)

Blah blah อ่าน HIG อย่าใช้คุณสมบัติที่ไม่มีเอกสารและทุกอย่าง มีปุ่มที่รองรับได้เพียงหกประเภทเท่านั้นและนี่ไม่ใช่หนึ่งในนั้น


1
ปุ่มชนิด 101 ดูเหมือนจะไม่ให้รูปร่างที่ชี้ไปทางซ้ายกับฉัน ... เป็นเพียงรูปสี่เหลี่ยมผืนผ้า
elsurudo

10
อย่าทำเช่นนี้ - แอปของคุณจะถูกปฏิเสธ โหวตคำตอบนี้ลง
thefaj

4
ฉันมีแนวโน้มที่จะคิดว่าเขาไม่แน่ใจ เขาพูดว่า "อย่าใช้ API ที่ไม่มีเอกสาร" แต่ไม่ได้ระบุว่าแอปของเขาถูกปฏิเสธ และไม่ใช่ API ที่ไม่มีเอกสาร - เป็นค่าที่ไม่มีเอกสาร หากใครมีแอปของพวกเขาถูกปฏิเสธโปรดโพสต์ ฉันได้รับการอนุมัติแอปอย่างต่อเนื่องกับค่านี้
AndrewS

1
@thefaj ฉันส่งแอปพร้อมรหัสนี้แล้วและได้รับการอนุมัติ
Aaron

1
นี่เป็นรูปแบบการเข้ารหัสที่แย่มาก คุณโชคดี แต่คุณควรใช้ API ที่ทำเป็นเอกสารเท่านั้น (ไม่ใช่ตัวเลขที่ไม่ได้เผยแพร่ / ไม่ได้เผยแพร่)
thefaj

36

ป้อนคำอธิบายรูปภาพที่นี่

ก่อนอื่นคุณต้องหาภาพของปุ่มย้อนกลับ ฉันใช้แอพที่เรียกว่าExtractorซึ่งแยกกราฟิกทั้งหมดจาก iPhone ใน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];

1
สวัสดีอเล็กซ์ขอบคุณสำหรับการแก้ปัญหา ปัญหาหนึ่งที่ฉันเผชิญกับโซลูชันที่นำมาใช้นี้คือ: พื้นที่การเข้าชมหมายถึงน้อยกว่าเมื่อฉันคลิกที่ลูกศรที่ handleBack ไม่ได้รับการโทร แต่เมื่อฉันคลิกที่ข้อความการโทรของ handleBack จะได้รับ กรุณาแนะนำเกี่ยวกับเรื่องนี้ ขอบคุณ
Yogesh Lolusare

ลองใช้ UITapGestureRecognizer ฉันแก้ไขคำถาม
Alexey

อาจเป็นไปได้ว่าคุณสามารถลองเพิ่มขนาดของมุมมองได้
Alexey

2
สีดำที่ปุ่มนี้ทำให้เป็นเทมเพลต คุณไม่จำเป็นต้องใช้ gimp เพื่อเปลี่ยนมัน เพียงใช้imageView.tint = [UIColor redColor]โหมดการแสดงสีอ่อนและเทมเพลตบนภาพ imageView.image = [yourImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
smokingoyster

18

ฉันไม่แน่ใจว่าจะใช้งานได้หรือไม่ แต่คุณสามารถลองสร้างUINavigationControllerด้วยการตั้งค่าเริ่มต้นเพื่อสร้างปุ่มค้นหาปุ่มในลำดับชั้นย่อยของตัวควบคุมการนำทางเรียกremoveFromSuperviewใช้ทำลายตัวควบคุมการนำทางแล้วเพิ่มปุ่มเป็น มุมมองย่อยของแถบเครื่องมือของคุณ คุณอาจต้องretainและปุ่มก่อนที่จะโทรremoveFromSuperview(และreleaseหลังจากเพิ่มเป็นมุมมองย่อยของแถบเครื่องมือของคุณ) เพื่อหลีกเลี่ยงการถูกจัดสรรคืนในระหว่างกระบวนการ


14

ในการทำให้ UIButton มีลูกศรอยู่ใกล้ (ฉันไม่ใช่นักออกแบบ;) ไปยังลูกศรย้อนกลับของระบบ iOS 7:

มาตรฐาน:

ลูกศรย้อนกลับของระบบมาตรฐาน

Apple SD Gothic Neo

Apple SD Gothic Neo <ตัวละคร

ใน Xcode:

  • มุ่งเน้นที่ฟิลด์ค่าหัวเรื่องของปุ่ม (หรือมุมมอง / การควบคุมอื่น ๆ ที่มีเนื้อหาข้อความ)
  • เปิดแก้ไข -> อักขระพิเศษ
  • เลือกกลุ่มวงเล็บและดับเบิลคลิกที่อักขระ '<'
  • เปลี่ยนแบบอักษรเป็น: Apple SD Gothic Neo, ธรรมดาที่มีขนาดที่ต้องการ (เช่น 20)
  • เปลี่ยนสีได้ตามที่คุณต้องการ

คำตอบของ Ref @ staticVoidManสำหรับลูกศรย้อนหลังบน iOS 7


8

ลูกศรย้อนกลับ

หากคุณไม่ต้องการรบกวนไฟล์ภาพรูปร่างลูกศรสามารถวาดในคลาสย่อย 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


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

ใช้งานได้สำหรับฉัน ฉันใช้สิ่งนี้เมื่อฉันมีแท็บเพิ่มเติมจากนั้นสามารถใส่ลงในแถบแท็บได้และตัวควบคุมมุมมองผลักจาก "เพิ่มเติม" ไปทางซ้ายมือ BarButtonItem ใน viewDidLoad


4

คุณสามารถค้นหาอิมเมจต้นฉบับโดยแยกออกจาก Other.artwork ใน UIKit $ {SDKROOT} /System/Library/Frameworks/UIKit.framework/Other.artwork ชุมชน modding มีเครื่องมือบางอย่างสำหรับการแยกพวกเขาที่นี่ เมื่อคุณแตกภาพคุณสามารถเขียนรหัสเพื่อเปลี่ยนสีตามความจำเป็นและตั้งเป็นภาพปุ่ม ไม่ว่าคุณจะสามารถจัดส่งสิ่งเหล่านี้ได้จริงหรือไม่ (เนื่องจากคุณกำลังฝังผลงานศิลปะที่ได้รับ) อาจเป็นเรื่องเล็กน้อยดังนั้นคุณอาจต้องการคุยกับทนายความ


4

ไลบรารี 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;

คุณสามารถโพสต์ภาพหน้าจอของผลลัพธ์สุดท้ายได้หรือไม่?
jm

1
มันดูแย่มาก ไม่เคยมีปุ่มย้อนกลับลูกศรซ้ายเพื่อดูค่อนข้างถูกต้อง ฉันเลิกและใช้ปุ่มย้อนกลับที่เหมาะสมกับระบบนำทาง Three20
Andrew Arrow

4

ฉันพบว่าการใช้เคล็ดลับง่ายๆในการโค้ดต่อไปนี้ (ต้องใช้รูปภาพที่กำหนดเองในชุดข้อมูล)

// 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];

2
สำหรับใครก็ตามที่มาที่หน้านี้ให้รวมคำตอบนี้กับคำตอบของ @ PyjamaSam
PrairieHippo

@PrairieHippo: เสร็จเรียบร้อยแล้ว น่าจะได้รับการแก้ไขตั้งแต่แรก อุดมคติ -1 สำหรับการไม่ทำเช่นนั้นตั้งแต่แรกปล่อยให้คนอื่นทำงาน
hakre

4

นี่คือสิ่งที่ฉันทำหลังจากค้นหาโซลูชันเหล่านี้และอื่น ๆ ทั้งหมด มันใช้ png ที่ยืดหยุ่นได้ที่ดึงมาจากภาพสต็อก UIKit วิธีนี้คุณสามารถตั้งค่าข้อความเป็นอะไรก็ได้ที่คุณต้องการ

// 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;

2
ควรใช้ UIControlState ไฮไลต์ไม่ใช่ UIControlStateSelected มิฉะนั้นรูปภาพจะสลับเมื่อสัมผัสปุ่ม
Jim

4

มันง่ายที่จะทำกับInterface BuilderในXcode 5.x

ผลลัพธ์

  • ใช้แถบเครื่องมือและรายการปุ่มบาร์จากไลบรารีวัตถุ

    ส่วนประกอบ

  • ในคุณสมบัติของผู้ตรวจสอบปุ่มแก้ไขส่วนภาพด้วยภาพปุ่มย้อนกลับของคุณ

    คุณสมบัติผู้ตรวจสอบ

ทำ!


2

ฉันพยายามทำสิ่งเดียวกัน แต่ฉันต้องการให้ปุ่มย้อนกลับอยู่ในแถบนำทาง (จริง ๆ แล้วฉันต้องการปุ่มย้อนกลับซึ่งจะทำมากกว่ากลับไปดังนั้นฉันจึงต้องใช้คุณสมบัติ leftBarButtonItem) ฉันลองใช้สิ่งที่ AndrewS แนะนำ แต่ในแถบการนำทางมันจะไม่มองอย่างที่ควรจะเป็นเนื่องจาก 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]];

1

ในการสร้างภาพสำหรับ UIToolbar ให้ทำ png ใน photoshop และที่ใดก็ตามที่มีสีใด ๆ ที่ทำให้เป็นสีขาวและที่ alpha = 0 จากนั้นจะปล่อยให้อยู่คนเดียว

SDK ใส่ขอบของไอคอนที่คุณสร้างขึ้นและเปลี่ยนเป็นสีขาวโดยที่คุณไม่ต้องทำอะไรเลย

ดูนี่คือสิ่งที่ฉันทำใน Photoshop สำหรับปุ่มไปข้างหน้าของฉัน (เห็นได้ชัดว่าสลับไปมาเพื่อปุ่มย้อนกลับ):

http://twitpic.com/1oanv

และนี่คือสิ่งที่ปรากฏในเครื่องมือสร้างส่วนต่อประสาน

http://twitpic.com/1oaoa


1

วิธีการแก้ปัญหาโดยไม่ต้องใช้ png ตามคำตอบ SO นี้: การเพิ่มลูกศรเล็ก ๆ ไปทางด้านขวาของเซลล์ใน iPhone TableView Cell

เพียงพลิก 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

Swift 5.2 Xcode 11.4

Apple Symbol chevron.leftอนุญาตให้ใช้โซลูชันที่สวยงามยิ่งขึ้นในการสร้างปุ่มแบบกำหนดเอง ฉันได้จับคู่ขนาดและระยะห่างให้ใกล้เคียงที่สุด

ป้อนคำอธิบายรูปภาพที่นี่

import UIKit

class CustomBackButton: UIBarButtonItem {

    convenience init(target: Any, selector: Selector) {

        // Create UIButton
        let button = UIButton(frame: .zero)

        // Customise Title
        button.setTitle("Back", for: .normal)
        button.setTitleColor(.systemBlue, for: .normal)
        button.titleLabel?.font = UIFont.systemFont(ofSize: 17)

        // Customise Image
        let config = UIImage.SymbolConfiguration(pointSize: 19.0, weight: .semibold, scale: .large)
        let image = UIImage(systemName: "chevron.left", withConfiguration: config)
        button.setImage(image, for: .normal)

        // Add Target
        button.addTarget(target, action: selector, for: .touchUpInside)

        // Customise Spacing to match system Back button
        button.imageEdgeInsets = UIEdgeInsets(top: 0.0, left: -18.0, bottom: 0.0, right: 0.0)
        button.titleEdgeInsets = UIEdgeInsets(top: 0.0, left: -12.0, bottom: 0.0, right: 0.0)

        self.init(customView: button)
    }
}

สิ่งนี้สามารถนำมาใช้ได้ไม่ว่าจะเป็นUIToolbarItemหรือUINavigationItem

override func viewDidLoad() {
    super.viewDidLoad()

    // UIToolbar Item
    let barBackButton = CustomBackButton(target: self, selector: #selector(backButtonTapped))
    let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    navigationController?.setToolbarHidden(false, animated: false)
    toolbarItems = [barBackButton, flexSpace]

    // Navigation Item
    let navBackButton = CustomBackButton(target: self, selector: #selector(backButtonTapped))
    navigationItem.leftBarButtonItem = navBackButton
}

@objc func backButtonTapped() {
    print("Back tapped")
}

หากคุณต้องการพลิกปุ่มและให้ลูกศรชี้ไปทางขวา:

ป้อนคำอธิบายรูปภาพที่นี่

ใช้สัญลักษณ์ Apple ชื่อ"chevron.right"

เพิ่มรหัสต่อไปนี้ในCustomBackButtonชั้นเรียน:

    // Put the image of the right side of the button
    button.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
    button.titleLabel?.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
    button.imageView?.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)

0

ถ้าคุณต้องการหลีกเลี่ยงการวาดมันด้วยตัวคุณเองคุณสามารถใช้คลาสที่ไม่มีเอกสาร: UINavigationButton ที่มีรูปแบบที่ 1 แน่นอนว่านี่อาจทำให้แอปพลิเคชันของคุณไม่ได้รับการอนุมัติ ... / John


0

คุณไม่จำเป็นต้องมีปุ่มที่แตกต่างกันสำหรับทุกขนาดคุณสามารถใช้[UIImage stretchableImageWithLeftCapWidth:topCapHeight:]แต่สิ่งเดียวที่ฉันพบคือภาพที่กำหนดเอง


0

ผมมีปัญหาที่คล้ายกันและออกมาหนึ่งห้องสมุดPButton และตัวอย่างคือปุ่มการนำทางด้านหลังเช่นปุ่มซึ่งสามารถใช้ได้ทุกที่เช่นเดียวกับปุ่มที่กำหนดเอง

บางสิ่งเช่นนี้ ป้อนคำอธิบายรูปภาพที่นี่


0

ตัวอย่างใน Swift 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]

0

รวดเร็ว

// 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

-5

ลองสิ่งนี้ ฉันแน่ใจว่าคุณไม่ต้องการรูปปุ่มย้อนกลับเพื่อสร้างรูปแบบดังกล่าว

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

นั่นคือทั้งหมดที่คุณต้องทำ :)


-23

ทำไมคุณทำเช่นนี้? ถ้าคุณต้องการบางสิ่งที่ดูเหมือนแถบนำทางให้ใช้ UINavigationBar

แถบเครื่องมือมีสไตล์ภาพเฉพาะที่เกี่ยวข้องกับพวกเขา แนวทางการเชื่อมต่อของมนุษย์สำหรับสถานะ iPhone:

แถบเครื่องมือจะปรากฏขึ้นที่ขอบด้านล่างของหน้าจอและมีปุ่มที่ดำเนินการที่เกี่ยวข้องกับวัตถุในมุมมองปัจจุบัน

จากนั้นให้ตัวอย่างภาพหลายภาพของไอคอนรูปสี่เหลี่ยมโดยไม่มีข้อความ ฉันอยากให้คุณติดตาม HIG ในเรื่องนี้


8
ฉันรู้เรื่องนี้แล้วขอบคุณ อย่างไรก็ตามฉันเชื่อว่าการใช้ที่ฉันตั้งใจไว้เหมาะสมแล้ว คุณสามารถช่วยได้มากขึ้นโดยสมมติว่าฉันต้องการทำสิ่งที่ฉันถามจริงๆหรือไม่?
Marco

หากคุณวางไว้ที่ด้านบนของหน้าจอแสดงว่ามีการใช้งานผิด เปรียบเทียบการไล่ระดับสีและเส้นขอบระหว่าง UINavigationBar และ UIToolbar และคุณจะเห็นว่ามันแตกต่างกันเล็กน้อย แน่นอนคุณต้องการใช้ UINavigationBar ที่ด้านบนของหน้าจอ
NilObject

10
ฉันวางไว้ที่ด้านล่าง
Marco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.