การย้าย UITabBarItem Image ลงหรือไม่


99

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

ฉันกำลังใช้ (ดูด้านล่าง) ในปัจจุบัน:

[tabBarItem setFinishedSelectedImage:tabSelected withFinishedUnselectedImage:tabUnselected];

แต่ต้องการใช้กับภาพขนาดใหญ่ที่ไม่มีชื่อเรื่องในขณะนี้ถ้าฉันทำให้ภาพใหญ่กว่าประมาณ 70pixels @ 2x มันจะเริ่มตัดขอบด้านบนของด้านบนในUITabBarขณะที่เหลือพื้นที่ที่ไม่ได้ใช้จำนวนมากไว้ที่ด้านล่าง

คำตอบ:


183

ลองปรับเปลี่ยนtabBarItem's imageInsets(สำหรับการย้ายภาพไอคอน) และการตั้งชื่อตัวควบคุมศูนย์ (จึงไม่มีชื่อปรากฏขึ้น) ใส่อะไรเช่นนี้-initหรือ-viewDidLoadวิธีการในการควบคุมมุมมอง:

วัตถุประสงค์ -C

self.tabBarItem.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0);
self.title = nil;

รวดเร็ว

self.tabBarItem.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)
self.title = nil

UITabBarItemเป็นคลาสย่อยUIBarItemที่มีUIEdgeInsets imageInsetsคุณสมบัติ เล่นกับสิ่งที่ใส่เข้าไปเล็กน้อยจนกว่าจะดูดี (ขึ้นอยู่กับภาพไอคอนแถบแท็บของคุณ)


3
@Lukas: แต่สิ่งนี้ทำให้ภาพหดลง
Sourabh Bhardwaj

1
@Sourabh ไม่ได้ย่อขนาดให้ฉัน
TigerCoding

7
ค่าอินเซ็ตที่แท้จริงคือ 5.5f หากคุณต้องการให้พิกเซลสมบูรณ์แบบ
ผู้ใช้

1
@ rr1g0 ไม่สามารถย้ายป้ายไปยังตำแหน่งที่กำหนดเองได้ หากคุณต้องการตำแหน่งที่กำหนดเองของตราหรือลักษณะของตราที่กำหนดเองคุณต้องติดตั้งด้วยตัวเอง
Lukas Kukacka

1
@Sourabh คุณต้องชดเชยด้านล่างด้วยค่าลบเพื่อไม่ให้ภาพหดตัว
Rmalmoe

151

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

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

* แสดงบน Xcode เวอร์ชัน 7.3.1 (7D1014)


สวยและสะอาด!
ken

ดีที่สุดสำหรับคำตอบ ... ขอบคุณมาก @Neil Galiaskarov
Venkatesh Chejarla

สั้นและชัดเจน ขอบคุณ👍🏻
Fadi Abuzant

50

สร้างคลาสย่อยของUITabBarControllerและในviewDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.viewControllers enumerateObjectsUsingBlock:^(UIViewController *vc, NSUInteger idx, BOOL *stop) {
        vc.tabBarItem.title = nil;
        vc.tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0);
    }];
}

Swift 3:

for vc in self.viewControllers! {
    vc.tabBarItem.title = nil
    vc.tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0)
}

สิ่งนี้ได้ผลสำหรับฉัน เพียงเพื่อความรวดเร็ววิธีการแจงนับ
ObjectsUsingBlock

อย่าคลาสย่อยให้ใส่ใน AppDelegate แทน
Laszlo

1
การใส่ข้อมูลโค้ดAppDelegateนี้ก็ใช้งานได้เช่นกัน แต่ก็ไม่ได้ดีไปกว่าคลาสย่อยอย่างเห็นได้ชัด คุณสามารถมีความชอบของตัวเองได้ :)
Brian

10

หากคุณใช้ Xamarin สิ่งนี้ใช้ได้:

screen.TabBarItem.ImageInsets = new UIEdgeInsets(5, 0, -5, 0);
screen.TabBarItem.Title = "";

10

สิ่งนี้ได้ผลสำหรับฉัน

สวิฟต์ 4

let array = tabBarController?.customizableViewControllers
for controller in array! {
    controller.tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0)
}

2

SWIFT 3.0

คุณสามารถตั้งค่าการตั้งค่ารูปภาพตั้งค่าบนซ้ายล่างและขวาตามการออกแบบ

self.tabBarItem.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: 0, right: 0)

2

สำหรับ iOS 11 คุณต้องแทนที่วิธีTraitCollectionนอกเหนือจากการตั้งค่า ImageInsets โปรดเพิ่มเมธอดในคลาส UITabBarController คลาสย่อยของคุณ

public override UITraitCollection TraitCollection {
 get {
  return UITraitCollection.FromHorizontalSizeClass(horizontalSizeClass: UIUserInterfaceSizeClass.Compact);
 }
}

เคล็ดลับดีๆที่ช่วยฉันแก้ปัญหาที่เกี่ยวข้องกับตำแหน่งรูปภาพสำหรับรายการแถบแท็บบน iPad และ iOS 11 แต่มันยากเกินไปที่จะแทนที่คอลเลกชันลักษณะที่ระดับตัวควบคุมมุมมองจะดีกว่าที่จะย่อยคลาส UITabBar และแทนที่คุณสมบัติ traitCollection นั่นเอง นอกจากนี้การส่งคืนคอลเลกชันลักษณะเฉพาะด้วยคลาสแนวนอนจะทำให้คุณสมบัติการรวบรวมลักษณะอื่น ๆ ลดลง return UITraitCollection(traitsFrom: [ super.traitCollection, UITraitCollection(horizontalSizeClass: .compact)])ทำเคล็ดลับให้ฉัน
Emmanuel Paris

1

ในสวิฟท์ 4.2 , UIEdgeInsetsMakeเป็น depricated แทนเราควรใช้UIEdgeInsets,

let array = tabBarController?.customizableViewControllers
    for controller in array! {
        controller.tabBarItem.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: -5, right: 0)
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.