ฉันไปงานเลี้ยงสายนี้นิดหน่อย แต่ฉันคิดว่าฉันมีสิ่งที่เป็นประโยชน์ในการเพิ่ม
คำตอบของ Keko นั้นยอดเยี่ยม แต่เนื่องจาก RonLugge กล่าวถึงมันสามารถทำให้ปุ่มไม่เคารพอีกต่อไปsizeToFit
หรือที่สำคัญกว่านั้นสามารถทำให้ปุ่มเพื่อคลิปเนื้อหาเมื่อมันมีขนาดที่แท้จริง อ๊ะ!
ก่อนอื่น
คำอธิบายสั้น ๆ เกี่ยวกับวิธีที่ฉันเชื่อimageEdgeInsets
และtitleEdgeInsets
ทำงาน:
เอกสารสำหรับimageEdgeInsets
มีดังต่อไปนี้จะพูดในส่วน:
ใช้คุณสมบัตินี้เพื่อปรับขนาดและเปลี่ยนตำแหน่งสี่เหลี่ยมวาดภาพที่มีประสิทธิภาพสำหรับรูปปุ่ม คุณสามารถระบุค่าที่แตกต่างกันสำหรับแต่ละสี่ insets (บนซ้ายซ้ายล่างขวา) ค่าบวกจะลดขนาดหรือแทรกเข้าไปขอบนั้นขยับไปใกล้กับจุดศูนย์กลางของปุ่มมากขึ้น ค่าลบจะขยายหรือลบออกขอบนั้น
ฉันเชื่อว่าเอกสารนี้เขียนขึ้นโดยนึกว่าปุ่มนั้นไม่มีชื่อ แต่เป็นภาพ มันทำให้รู้สึกถึงความคิดในวิธีนี้มากขึ้นและประพฤติตามUIEdgeInsets
ปกติ โดยทั่วไปกรอบของภาพ (หรือชื่อเรื่องด้วยtitleEdgeInsets
) จะถูกย้ายเข้าด้านในสำหรับส่วนที่เป็นบวกและด้านนอกสำหรับส่วนที่เป็นลบ
ตกลงอะไร
ฉันไปถึงที่นั่น! นี่คือสิ่งที่คุณมีตามค่าเริ่มต้นการตั้งค่ารูปภาพและชื่อ (เส้นขอบปุ่มเป็นสีเขียวเพื่อแสดงว่ามันอยู่ที่ไหน):
เมื่อคุณต้องการเว้นระยะห่างระหว่างรูปภาพและชื่อโดยไม่ทำให้ทั้งสองถูกบดขยี้คุณจะต้องตั้งค่าการแทรกสี่แบบที่แตกต่างกันสองรายการในแต่ละภาพและชื่อ นั่นเป็นเพราะคุณไม่ต้องการเปลี่ยนขนาดของเฟรมองค์ประกอบเหล่านั้น แต่เพียงตำแหน่งของพวกเขา เมื่อคุณเริ่มคิดแบบนี้การเปลี่ยนแปลงที่จำเป็นในหมวดหมู่ที่ยอดเยี่ยมของ Kekoa จะชัดเจน:
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
}
@end
แต่เดี๋ยวก่อนคุณพูดเมื่อฉันทำอย่างนั้นฉันจะได้สิ่งนี้:
โอ้ใช่! ฉันลืมเอกสารเตือนฉันเกี่ยวกับเรื่องนี้ พวกเขากล่าวว่าในส่วน:
คุณสมบัตินี้ใช้สำหรับวางตำแหน่งภาพในระหว่างการจัดวางเท่านั้น ปุ่มไม่ได้ใช้คุณสมบัตินี้ในการตรวจสอบและintrinsicContentSize
sizeThatFits:
แต่มีเป็นcontentEdgeInsets
คุณสมบัติที่สามารถช่วยและที่ เอกสารสำหรับการพูดในส่วนที่:
ปุ่มที่ใช้คุณสมบัตินี้ในการตรวจสอบและintrinsicContentSize
sizeThatFits:
นั่นฟังดูดี ดังนั้นเรามาปรับแต่งหมวดหมู่อีกครั้ง:
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
self.contentEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, insetAmount);
}
@end
แล้วคุณจะได้อะไร
ดูเหมือนจะเป็นผู้ชนะสำหรับฉัน
ทำงานในสวิฟท์และไม่อยากคิดอะไรเลยเหรอ? นี่คือส่วนขยายรุ่นสุดท้ายใน Swift:
extension UIButton {
func centerTextAndImage(spacing: CGFloat) {
let insetAmount = spacing / 2
imageEdgeInsets = UIEdgeInsets(top: 0, left: -insetAmount, bottom: 0, right: insetAmount)
titleEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: -insetAmount)
contentEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: insetAmount)
}
}