ฉันมี UIButtons สองสามปุ่มและใน IB พวกเขาถูกตั้งค่าเป็น Aspect Fit แต่ด้วยเหตุผลบางอย่างพวกเขามักจะยืดออก คุณต้องตั้งค่าอย่างอื่นหรือไม่? ฉันลองใช้โหมดมุมมองที่แตกต่างกันทั้งหมดแล้ว แต่ก็ไม่มีอะไรทำงานเลย
ฉันมี UIButtons สองสามปุ่มและใน IB พวกเขาถูกตั้งค่าเป็น Aspect Fit แต่ด้วยเหตุผลบางอย่างพวกเขามักจะยืดออก คุณต้องตั้งค่าอย่างอื่นหรือไม่? ฉันลองใช้โหมดมุมมองที่แตกต่างกันทั้งหมดแล้ว แต่ก็ไม่มีอะไรทำงานเลย
คำตอบ:
ฉันเคยมีปัญหานั้นมาก่อน ฉันแก้ไขได้โดยใส่รูปภาพของฉันในUIImageView
ตำแหน่งที่contentMode
การตั้งค่าใช้งานได้จริงและวางค่ากำหนดเองแบบโปร่งใสUIButton
ไว้ด้านบน
แก้ไข: คำตอบนี้ล้าสมัย ดูคำตอบของ @Werner Altewischerสำหรับคำตอบที่ถูกต้องใน iOS เวอร์ชันใหม่
การแก้ปัญหาคือการตั้งค่าcontentMode
ในทรัพย์สินของimageView
จะต้องมีการสร้างขึ้นด้วยประเภทที่กำหนดเองสำหรับการทำงานผมเชื่อว่า (มิฉะนั้นจะถูกส่งกลับสำหรับคุณสมบัตินี้)UIButton
UIButton
nil
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
วิธีนี้ใช้ได้ผลดีกับฉันมาก:
ในXibเลือกปุ่มและตั้งค่าuser defined runtime attributes
:
self.imageView.contentMode
Number
1
เราใช้หมายเลขเพราะคุณไม่สามารถใช้ enum ที่นั่นได้ แต่ UIViewContentModeScaleAspectFit เท่ากับ 1
extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
imageView.contentMode
ทำงานให้ฉัน!
ใช้ imageView ของปุ่มสำหรับ contentMode ไม่ได้อยู่ที่ปุ่มโดยตรง
homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];
หากคุณวางภาพUIImageView
ไว้ด้านหลังปุ่มคุณจะสูญเสียฟังก์ชันการทำงานในตัวของUIButton
คลาสเช่นadjustsImageWhenHighlighted
และadjustsImageWhenDisabled
และแน่นอนความสามารถในการตั้งค่าภาพที่แตกต่างกันสำหรับสถานะที่แตกต่างกัน (โดยไม่ต้องทำสิ่งนี้ด้วยตัวเอง)
หากเราต้องการให้ภาพที่ไม่มีการตรึงสำหรับสถานะการควบคุมทั้งหมด approuch หนึ่งคือการรับภาพโดยใช้imageWithCGImage:scale:orientation
วิธีการต่อไปนี้:
- (UIImage *) getScaledImage:(UIImage *)img insideButton:(UIButton *)btn {
// Check which dimension (width or height) to pay respect to and
// calculate the scale factor
CGFloat imgRatio = img.size.width / img.size.height,
btnRatio = btn.frame.size.width / btn.frame.size.height,
scaleFactor = (imgRatio > btnRatio
? img.size.width / btn.frame.size.width
: img.size.height / btn.frame.size.height;
// Create image using scale factor
UIImage *scaledImg = [UIImage imageWithCGImage:[img CGImage]
scale:scaleFactor
orientation:UIImageOrientationUp];
return scaledImg;
}
ในการดำเนินการนี้เราจะเขียน:
UIImage *scaledImg = [self getScaledImage:myBtnImg insideButton:myBtn];
[myBtn setImage:scaledImg forState:UIControlStateNormal];
สิ่งนี้ควรป้องกันไม่ให้ภาพยืดออกในสถานะควบคุมทั้งหมด มันได้ผลสำหรับฉัน แต่โปรดแจ้งให้เราทราบหากไม่ได้ผล!
หมายเหตุ: ที่นี่เรากำลังแก้ไขปัญหาที่เกี่ยวข้องUIButton
แต่insideButton:
อาจเป็นเช่นกันinsideView:
หรืออะไรก็ได้ที่ต้องการให้พอดีกับภาพ
ฉันมีปัญหานี้อยู่ครู่หนึ่ง ปัญหาที่ฉันพบคือฉันพยายามใช้เอฟเฟกต์นี้กับ UIButton พื้นหลังซึ่งมีข้อ จำกัด ดังนั้นคุณจึงไม่สามารถปรับได้อย่างง่ายดาย
เคล็ดลับคือตั้งเป็นแค่ภาพจากนั้นใช้เทคนิคของ @ ayreguitar และควรแก้ไข!
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
สิ่งนี้ได้ผลสำหรับฉัน
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
ขอบคุณ @ayreguitar สำหรับความคิดเห็นของเขา
นี่เป็นคำตอบทางเลือกอย่างรวดเร็ว:
myButton.imageView?.contentMode = .ScaleAspectFit
การรวมคำตอบที่แตกต่างกันสองสามคำเข้าด้วยกันในโซลูชันเดียว - สร้างปุ่มด้วยประเภทที่กำหนดเองตั้งค่าคุณสมบัติ imageView contentMode ของปุ่มและตั้งค่ารูปภาพสำหรับปุ่ม (ไม่ใช่ภาพพื้นหลังซึ่งจะยังคงปรับขนาดเพื่อเติมเต็ม)
//Objective-C:
UIImage *image = [UIImage imageNamed:"myImageName.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
//Swift:
let image = UIImage(named: "myImageName.png")
let button = UIButton(type: .custom)
button.imageView?.contentMode = .scaleAspectFit
button.setImage(image, for: .normal)
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;
คำตอบนี้จะขึ้นอยู่กับ@ คำตอบของ
เพื่อหลีกเลี่ยงการเชื่อมต่อปุ่มของฉันเข้ากับ IBOutlet เพื่อรันโค้ดบนนั้นฉันเลือกคลาสของ UIButton คลาสย่อย:
// .h
@interface UIButtonWithImageAspectFit : UIButton
@end
// .m
@implementation UIButtonWithImageAspectFit
- (void) awakeFromNib {
[self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}
@end
ตอนนี้สร้างปุ่มที่กำหนดเองใน xib ของคุณและตั้งค่าภาพ (ไม่ใช่ภาพพื้นหลัง):
จากนั้นตั้งค่าระดับ:
เสร็จแล้ว!
แทนที่จะ
พอดีกับขนาดภาพของปุ่มของคุณตอนนี้เป็นไปตามที่คาดไว้:
iOS 12. คุณต้องเพิ่มการจัดตำแหน่งเนื้อหาด้วย
class FitButton: UIButton {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
self.imageView?.contentMode = .scaleAspectFill
self.contentHorizontalAlignment = .fill
self.contentVerticalAlignment = .fill
super.layoutSubviews()
}
}
ฉันมีปัญหากับรูปภาพที่ไม่ได้ปรับขนาดตามสัดส่วนดังนั้นวิธีที่ฉันแก้ไขคือการใช้ขอบแทรก
fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
โหมดเนื้อหา UIView ใช้กับ "เนื้อหา" ของ CALayer ที่เกี่ยวข้อง งานนี้UIImageView
เพราะพวกเขาตั้งค่าเนื้อหาที่สอดคล้องกันCALayer
CGImage
drawRect:
ในที่สุดก็แสดงผลไปยังเนื้อหาเลเยอร์
กำหนดเองUIButton
(เท่าที่ฉันรู้) ไม่มีเนื้อหา (ปุ่มลักษณะสี่เหลี่ยมผืนผ้าโค้งมนอาจแสดงผลโดยใช้เนื้อหา) ปุ่มที่มี subviews: พื้นหลังUIImageView
ภาพและชื่อUIImageView
UILabel
การตั้งค่าcontentMode
บนมุมมองย่อยอาจทำในสิ่งที่คุณต้องการ แต่การยุ่งกับUIButton
ลำดับชั้นของมุมมองเป็นเรื่องที่ไม่น่าสนใจ
การเปลี่ยนUIButton.imageView.contentMode
ไม่ได้ผลสำหรับฉัน
ฉันแก้ไขปัญหาโดยตั้งค่ารูปภาพเป็นคุณสมบัติ "พื้นหลัง"
คุณสามารถเพิ่มข้อ จำกัด อัตราส่วนได้หากต้องการ
สิ่งนี้ทับซ้อนกับคำตอบอื่น ๆ มากมาย แต่วิธีแก้ปัญหาสำหรับฉันคือ
contentMode
ของUIImageView
ปุ่มสำหรับ.ScaleAspectFit
- ซึ่งสามารถทำได้ใน "User Defined Runtime Attributes" ใน Interface Builder (เช่นself.imageView.contentMode
หมายเลข 1) หรือในUIButton
คลาสย่อยคุณสามารถใช้ imageWithCGImage ดังที่แสดงด้านบน (แต่ไม่มีวงเล็บที่ขาดหายไป)
นอกจากนี้ ... โทรศัพท์ที่ไม่ใช่ 4.0 หลายล้านเครื่องจะไม่ทำงานกับรหัสนั้นเลย
[button sizeToFit]
ทำงานให้ฉัน
คล้ายกับ @Guillaume ฉันได้สร้างคลาสย่อยของ UIButton เป็น Swift-File จากนั้นตั้งค่าคลาสที่กำหนดเองของฉันใน Interface Builder:
และนี่คือไฟล์ Swift:
import UIKit
class TRAspectButton : UIButton {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.imageView?.contentMode = .ScaleAspectFit
}
}
ฉันมีปัญหาเดียวกัน แต่ไม่สามารถใช้งานได้ (อาจเป็นข้อบกพร่องของ SDK)
ในที่สุดเพื่อเป็นการแก้ปัญหาชั่วคราวUIImageView
ฉันวางปุ่มด้านหลังและตั้งค่าตัวเลือกที่ต้องการจากนั้นก็วางช่องว่างUIButton
ไว้ด้านบน