เป็นไปได้ไหมที่จะปรับตำแหน่ง x, y สำหรับ titleLabel ของ UIButton


121

เป็นไปได้ไหมที่จะปรับตำแหน่ง x, y สำหรับtitleLabela UIButton?

นี่คือรหัสของฉัน:

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    [btn setFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
    [btn setTitle:[NSString stringWithFormat:@"Button %d", i+1] forState:UIControlStateNormal];     
    [btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    btn.titleLabel.frame = ???

1
โปรดเลือกคำตอบอื่นเพื่อให้เราสามารถลบคำตอบที่เป็นลบได้ หรืออธิบายสาเหตุที่คุณทำเช่นนี้
tchrist

1
ทำไมคำตอบนั้นไม่ได้รับการยอมรับ?
Antonio MG

นี่คือทั้งหมดที่คุณต้องการstackoverflow.com/questions/18484747/uibutton-titleedgeinsets

คำตอบ:


445
//make the buttons content appear in the top-left
[button setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[button setContentVerticalAlignment:UIControlContentVerticalAlignmentTop];

//move text 10 pixels down and right
[button setTitleEdgeInsets:UIEdgeInsetsMake(10.0f, 10.0f, 0.0f, 0.0f)];

และใน Swift

//make the buttons content appear in the top-left
button.contentHorizontalAlignment = .Left
button.contentVerticalAlignment = .Top

//move text 10 pixels down and right
button.titleEdgeInsets = UIEdgeInsetsMake(10.0, 10.0, 0.0, 0.0)

สวิฟต์ 5

button.contentHorizontalAlignment = .left
button.contentVerticalAlignment = .top
button.titleEdgeInsets = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 0.0, right: 0.0)

3
นี่คือคำตอบที่ดีที่สุดอย่างแน่นอน
greenisus

3
ฉันสงสัยว่าทำไมผู้ถามถึงเลือกคำตอบอื่น อันนี้ไกลกว่า
Joshua

4
ฉันไม่ต้องการสองบรรทัดแรกด้วยซ้ำ ... setTitleEdgeInsets:คือทั้งหมดที่ฉันพบว่าจำเป็นในการเลื่อนข้อความไปรอบ ๆ
ArtOfWarfare

นี่ถูกต้องแน่นอน แต่อาจทำได้ง่ายกว่าโดยใช้ตัวสร้างอินเทอร์เฟซ (ตามที่อธิบายไว้ในคำตอบของฉัน)
eladleb

สองบรรทัดแรกจัดตำแหน่งข้อความของคุณเป็น 0,0 (x, y) สิ่งนี้สามารถป้องกันการวางตำแหน่งสัมพัทธ์ โดยเฉพาะอย่างยิ่งถ้าคุณตั้งค่าการจัดตำแหน่งเริ่มต้นใน xib
Jarrett Barnett

40

วิธีที่ง่ายที่สุดในการทำให้มองเห็นได้คือใช้ตัวตรวจสอบแอตทริบิวต์ ** (ปรากฏขึ้นเมื่อแก้ไข xib / storyboard) ตั้งค่าคุณสมบัติ " edge " เป็นชื่อเรื่องปรับค่าสิ่งที่ใส่เข้าไปจากนั้นตั้งค่าคุณสมบัติ "edge" ให้กับรูปภาพและปรับให้เหมาะสม . โดยปกติจะดีกว่าการเข้ารหัสเนื่องจากง่ายต่อการดูแลรักษาและมีภาพที่ชัดเจน

การตั้งค่าตัวตรวจสอบคุณสมบัติ


1
เคล็ดลับที่ดีมีการเปลี่ยนแปลงEdgeไปTitleแล้วปรับสิ่งที่ใส่เข้าไป!
คณบดี

สำหรับการอ้างอิงในอนาคตตั้งแต่ Xcode 8 แทนที่จะตั้งค่าedgeคุณสมบัติคุณสามารถปรับค่าที่ใส่หัวเรื่องในตัวตรวจสอบขนาดได้
dbmrq

14

มาจาก UIButton และใช้วิธีการต่อไปนี้:

- (CGRect)titleRectForContentRect:(CGRect)contentRect;

แก้ไข:

@interface PositionTitleButton : UIButton
@property (nonatomic) CGPoint titleOrigin;
@end

@implementation PositionTextButton
- (CGRect)titleRectForContentRect:(CGRect)contentRect {
  contentRect.origin = titleOrigin;
  return contentRect;
}
@end

ขอบคุณนี่คือสิ่งที่ฉันต้องการจริงๆ การจัดกึ่งกลางอัตโนมัติไม่เพียงพอ
dmzza

4

สำหรับโครงการของฉันฉันมียูทิลิตี้ส่วนขยายนี้:

extension UIButton {

    func moveTitle(horizontal hOffset: CGFloat, vertical vOffset: CGFloat) {
        self.titleEdgeInsets.left += hOffset
        self.titleEdgeInsets.top += vOffset
    }

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