การจัดการการหมุนของ UINavigationBar ที่คลาสย่อยด้วยปุ่ม

ฉันได้คลาสย่อย UINavigationBar เพื่อให้มีแถบการนำทางที่กำหนดเองภายในแอปพลิเคชันของฉัน แถบนี้ถูกนำมาใช้ซ้ำบนตัวควบคุมหลายมุมมองที่มีปุ่มเมนูสไตล์เดียวกันกับรายการปุ่มด้านซ้าย ซึ่งเป็นสาเหตุที่ทำให้มีคลาสย่อย

จากนั้นคลาสย่อยจะถูกเพิ่มลงในแถบการนำทาง View Controllers ในกระดานเรื่องราว

นี่คือรหัสภายในคลาสย่อย UINavigationBar:

- (void)drawRect:(CGRect)rect
{
    // Drawing code
    UIImage *image = [[UIImage imageNamed: @"mainNavBar"] resizableImageWithCapInsets:UIEdgeInsetsMake(0,5,0,5)];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

-(void)awakeFromNib {
    UIButton *leftButton = [[UIButton alloc]initWithFrame:CGRectMake(7.0f, 7.0f, 38.0f, 29.0f)];
    [leftButton setImage:[UIImage imageNamed:@"menuBarItem"] forState:UIControlStateNormal];
    [leftButton addTarget:nil action:@selector(menuItemPressed:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:leftButton];
}

ปัญหาคือ การหมุนของอุปกรณ์ ฉันยังมีโค้ดบางส่วนใน appDidFinishLaunching โดยใช้ API ลักษณะที่ปรากฏสำหรับการตั้งค่าเพิ่มเติม:

// Custom Navigation Bar appearance setup
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
                                                       [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], UITextAttributeTextColor,
                                                       [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5],UITextAttributeTextShadowColor,
                                                       [NSValue valueWithUIOffset:UIOffsetMake(0, 1)],
                                                       UITextAttributeTextShadowOffset,nil]];
// Used to deal with the rotation of the nav bar when implemented outside of Navigation Controller
[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleHeight];
[[UINavigationBar appearance] setContentMode:UIViewContentModeScaleAspectFit];
// Used to push the title down slightly when in Landscape and NavBar outside of Navigation Controller
[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:2 forBarMetrics:UIBarMetricsLandscapePhone];

เมื่ออุปกรณ์หมุน อุปกรณ์ทั้งหมดจะทำงานได้อย่างถูกต้องในแง่ของความสูงของแถบตามที่คาดไว้ตั้งแต่ 44 ถึง 32px อย่างไรก็ตาม ปุ่มต่างๆ ยังคงปรากฏอยู่ด้านนอกของแถบ ป้อนคำอธิบายรูปภาพที่นี่

ฉันได้ดูโพสต์ SO อื่น ๆ เกี่ยวกับเรื่องนี้แล้ว แต่ไม่สามารถหาวิธีดำเนินการให้ถูกต้องได้: iPhone: UINavigationBar พร้อมปุ่ม - ปรับความสูง

UINavigationBar ปรับขนาดอัตโนมัติ

ตามหลักการแล้ว ฉันไม่ต้องการจัดการกับการหมุนอัตโนมัติใน View Controller เนื่องจาก UINavigationBar นี้ถูกนำมาใช้ซ้ำผ่าน VC จำนวนมาก การเพิ่มรหัสการหมุนเวียนอัตโนมัติหมายความว่า VC แต่ละคนอาจต้องการสิ่งนี้ด้วยหรือไม่

แก้ไข - คำตอบต่อไปนี้หากฉันเปลี่ยน awakeFromNib เพื่อรวมสิ่งต่อไปนี้:

UINavigationItem* ni = [[UINavigationItem alloc] initWithTitle:@"Test"];
    UIImage *menuBgImage = [UIImage imageNamed:@"menuBarItem"];
    UIBarButtonItem *b =[[UIBarButtonItem alloc] initWithImage:menuBgImage landscapeImagePhone:menuBgImage style:UIBarButtonItemStylePlain target:nil action:@selector(menuItemPressed:)];
    ni.leftBarButtonItem = b;
    self.items = @[ni];

ฉันมีปัญหาที่ UIBarButtonItemStylePlain ทำลายรูปภาพ: ป้อนคำอธิบายรูปภาพที่นี่

หากฉันตั้งค่าก่อนหน้าด้วย initWithCustomView และใช้ปุ่มซ้ายจากโค้ดต้นฉบับ ด้วยปุ่มซ้ายที่ใช้การปรับขนาดอัตโนมัติสำหรับความสูง - ฉันจึงได้ภาพที่ยืดออกไม่ดีในแนวนอนใช่ไหม

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

แก้ไข 2 - รูปภาพเพิ่มเติมต่อคำตอบ ป้อนคำอธิบายรูปภาพที่นี่


comment
คุณต้องตั้งค่าการปรับขนาดอัตโนมัติของ UIbButton ที่คุณกำลังสร้างในวิธี wakeFromNib และยังเปิดใช้งานคุณสมบัติ autoresizesubviews ของ navigatonBar   -  person fibnochi    schedule 03.05.2013
comment
คุณช่วยยืนยันวิธีการทำสิ่งนี้ให้สำเร็จได้ไหม?   -  person StuartM    schedule 03.05.2013
comment
*** ประเภทคุณสมบัติที่ผิดกฎหมาย c ในตัวเลือกการร้องขอ _UIAppearance_setAutoresizesSubviews: เมื่อพยายามตั้งค่า '[[ลักษณะ UINavigationBar] setAutoresizesSubviews:YES];'   -  person StuartM    schedule 03.05.2013


คำตอบ (1)


[self addSubview:leftButton];

นั่นคือปัญหา. นี่ไม่ใช่วิธีที่คุณเพิ่มสิ่งต่าง ๆ ลงใน UINavigationBar! คุณต้องเริ่มต้นด้วย UINavigationItem และตั้งค่าปุ่มเป็น UIBarButtonItem รายการปุ่มแถบจะถูกปรับเมื่อมีการปรับขนาดแถบนำทาง

นี่เป็นตัวอย่างง่ายๆ ในการเริ่มต้น (อาจอยู่ใน awakeFromNib ของคุณ):

UINavigationItem* ni = [[UINavigationItem alloc] initWithTitle:@"Test"];
UIBarButtonItem* b = [[UIBarButtonItem alloc] initWithTitle:@"Howdy"
    style:UIBarButtonItemStyleBordered
    target:self action:@selector(pushNext:)];
ni.leftBarButtonItem = b;
self.items = @[ni];

อย่างไรก็ตาม โปรดทราบว่านี่ ไม่ จะทำงานหากคุณใช้ UINavigationBar นี้เป็นส่วนหนึ่งของ UINavigationController! ปุ่มแถบด้านซ้ายจะถูกผลักออกโดย navigationItem ของตัวควบคุมมุมมอง หากนี่เป็นส่วนหนึ่งของอินเทอร์เฟซการนำทางมาตรฐาน เพียงแค่ให้ตัวควบคุมการนำทางทุกตัวเพิ่มรายการปุ่มแถบด้านซ้าย

นอกจากนี้คุณไม่ควรใช้ drawRect ตั้งค่าภาพพื้นหลังของแถบนำทางแทน

person matt    schedule 03.05.2013
comment
คุณรู้เพิ่มเติมเกี่ยวกับการเริ่มต้นด้วย UINavigationItem ที่ไม่มีในรูปลักษณ์ API หรือไม่ - person StuartM; 03.05.2013
comment
ฉันไม่เข้าใจวิธีเข้าถึง UINavigationItem ที่สร้างโดยคลาสย่อยจากภายในคลาสย่อยของ UINavigationBar กรุณาแจ้งให้เราทราบข้อมูลอื่น ๆ - person StuartM; 03.05.2013
comment
คุณไม่ได้ทำ addSubview โดยใช้ API ลักษณะที่ปรากฏเช่นกัน คุณแค่ทำมันในคลาสย่อย ฉันกำลังบอกว่าแทนที่จะทำอย่างนั้น ให้ทำด้วยวิธีที่ถูกต้อง: สร้าง UINavigationItem ตั้งค่า leftBarButtonItem แล้วดันไปที่แถบนำทาง - person matt; 03.05.2013
comment
ขอบคุณแมตต์ อะไรคือวิธีที่ถูกต้องในการดำเนินการนี้? สมบูรณ์ผ่าน API ลักษณะหรือส่วนที่มีคลาสย่อยด้วยหรือไม่ ฉันไม่แน่ใจว่าจะตั้งค่าพื้นหลังจากภายในคลาสย่อยอื่นที่ไม่ใช่ DrawInRect ได้อย่างไร หรือคุณตั้งใจจะตั้งค่าพื้นหลังใน Appearance API แทน - person StuartM; 03.05.2013
comment
ไม่สำคัญหรอก เพราะคุณมีคลาสย่อยอยู่แล้ว เพียงโทร setBackgroundImage ใน awakeFromNib ของคุณ - person matt; 03.05.2013
comment
ฉันได้แทนที่ [image DrawInRect... ด้วย [self setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; และตอนนี้ไม่มีภาพพื้นหลังแสดงเลยเหรอ? - person StuartM; 03.05.2013
comment
น่าเสียดายที่ใช้งานไม่ได้ พื้นหลังไม่แสดงทั้งในแนวนอนหรือแนวตั้ง เกี่ยวกับการปรับขนาดปุ่ม ฉันได้แก้ไขคำถามพร้อมข้อมูลเพิ่มเติมเกี่ยวกับปัญหาที่ฉันเผชิญอยู่ตอนนี้ - person StuartM; 03.05.2013
comment
พื้นหลังได้รับการแก้ไขโดยไม่เอาชนะ DrawRect และใช้ setBackground ด้วยตนเอง... ใน wakeFromNib โดยเฉพาะ DrawRect ที่ไม่เอาชนะทำให้มันแสดง แต่ยังคงเป็นปัญหาการปรับขนาด - person StuartM; 03.05.2013
comment
อย่าใช้ UIBarButtonItemStylePlain คุณควรสร้างรายการปุ่มแถบด้วย initWithCustomView และมุมมองควรเป็น UIImageView ที่มีรูปภาพของคุณ - person matt; 03.05.2013
comment
ใช่ นั่นคือส่วนสุดท้ายของการแก้ไขด้านบนของฉัน ฉันได้ลองใช้ initWithCustomView โดยโหลด UIButton หรือ UIImageView แล้วและทั้งคู่ก็มีผลเช่นเดียวกับที่แสดงในภาพหน้าจอสุดท้ายด้านบน - person StuartM; 03.05.2013
comment
ตั้งค่ามุมมองรูปภาพ contentMode เป็นสิ่งที่ดีกว่า เช่น UIViewContentModeCenter วิธีนี้จะป้องกันไม่ให้รูปภาพถูกยืดออกเมื่อปรับขนาดมุมมองรูปภาพ คุณอาจต้องทดลองใช้โหมดต่างๆ จนกว่าคุณจะได้โหมดที่ถูกต้อง... :) - person matt; 03.05.2013
comment
ขอบคุณ น่าเสียดายที่โชคไม่ดีกับสิ่งนี้ ฉันได้อ่านทุกตัวเลือกสำหรับ contentMode แล้วและยังคงเป็นปัญหาเดียวกัน รูปภาพมีขนาดตามภาพหน้าจอหรือขนาดต้นฉบับเต็ม (เนื่องจากเป็นแนวตั้ง) ซึ่งหมายความว่ามีขนาดใหญ่เกินไปสำหรับแถบนำทาง :/ - person StuartM; 03.05.2013
comment
จริงหรือ แล้ว UIViewContentModeScaleAspectFit ล่ะ ควรรักษาสัดส่วนให้ถูกต้องโดยทำให้พอดีกับส่วนสูงที่เล็กกว่า - person matt; 03.05.2013
comment
ฉันได้เพิ่มรูปภาพที่แสดงรหัส/ผลลัพธ์ของคำถามอีกครั้ง - person StuartM; 03.05.2013
comment
เว้นแต่ว่านั่นเป็นภาพที่ปรับขนาดใหม่ที่ถูกต้องจริง ๆ ?? ดูแปลกเล็กน้อย และจำเป็นต้องจัดตำแหน่งในขณะนี้... ฉันเพิ่มระยะขอบด้านซ้ายและด้านบนที่ปรับขนาดได้ ดังนั้นจึงคิดว่าควรพอดีอย่างถูกต้อง - person StuartM; 03.05.2013
comment
ยอมรับว่าเป็นคำตอบที่ตัดสินใจว่าจะไม่ให้มุมมองเหล่านี้ในแนวนอน พิสูจน์ได้ว่ายากสำหรับบางสิ่งที่เรียบง่าย :) ฉันมีปัญหาบางอย่างเกี่ยวกับชื่อเรื่อง แต่จะถามคำถามใหม่ ขอบคุณสำหรับความช่วยเหลือของคุณ @matt - person StuartM; 04.05.2013