UIButton ไม่รับฟังการตั้งค่าโหมดเนื้อหา?


92

firstButton เป็น UIButton ประเภท Custom ฉันวางโปรแกรมไว้สามตัวในแต่ละเซลล์ของตารางด้วยเหตุนี้:

[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];

ที่อื่นผมบอกให้ clipToBounds สิ่งที่ฉันได้รับคือการครอบตัดสี่เหลี่ยมจัตุรัสตรงกลางของภาพแทนที่จะเป็นการเรนเดอร์ที่ปรับขนาดของภาพ ฉันได้ลองหลายวิธีแล้วรวมถึงการตั้งค่าคุณสมบัติโหมดใน firstButton.imageView ซึ่งดูเหมือนจะไม่ได้ผล


1
ดูวิธีแก้ปัญหาโดย Chris Nolet ด้านล่าง: button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
แมตต์

โปรดดูstackoverflow.com/a/28205566/481207ซึ่งแสดงว่าการตั้งค่าทั้ง contentVerticalAlignment และ contentHorizontalAlignment จำเป็นสำหรับ UIViewContentModeScaleAspectFit
Matt

คำตอบ:


187

ผมมีปัญหาเหมือนกัน. ฉันเห็นว่าคำถามนี้เก่าไปหน่อย แต่ฉันต้องการให้คำตอบที่ชัดเจนและถูกต้องเพื่อช่วยชีวิตคนอื่น ๆ (เช่นฉัน) ในบางครั้งเมื่อคำถามนี้ปรากฏขึ้นในผลการค้นหาของพวกเขา

ฉันใช้เวลาค้นหาและทดลองเล็กน้อย แต่ฉันพบวิธีแก้ปัญหา เพียงตั้งค่า ContentMode ของ ImageView ที่ "ซ่อน" ซึ่งอยู่ภายใน UIButton

[[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
[firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];

บางทีนั่นอาจเป็นสิ่งที่ Dan Ray พูดถึงในคำตอบที่เขายอมรับ แต่ฉันสงสัยว่าไม่ใช่


1
ไม่มันไม่ใช่ วิธีแก้ปัญหาที่ฉันตัดสินคือใช้ UIImageView เพื่อเก็บภาพจากนั้นจึงใช้ UIButton ที่ชัดเจนและโปร่งใสเป็นประเภท "กำหนดเอง" ที่ด้านบน
Dan Ray

Dave บน iOS 3.2 อย่างน้อยโซลูชันของคุณดูเหมือนจะไม่ได้ผลสำหรับฉัน เสียดายจังเพราะหวังว่าจะได้ไฮไลต์ของภาพเมื่อคลิก "ฟรี" ฉันตรวจสอบให้แน่ใจด้วยซ้ำว่าปุ่มนั้น IMageView ไม่ใช่ศูนย์ที่ฉันตั้งค่า contentMode และตั้งค่าภาพหลังจากตั้งค่า contentMode เช่นเดียวกับที่คุณทำ
Jacques

2
เพื่อชี้แจงว่า "ใช้งานไม่ได้" หมายความว่า "ภาพแสดงด้วยความละเอียดเต็มที่ไม่ได้ลดขนาดลงอย่างที่หวังไว้"
Jacques

Jacques ข้างต้นใช้ได้กับฉันใน iOS 4.x. ขออภัยฉันสามารถสร้างปัญหา "ไม่ปรับขนาด" ซ้ำได้เมื่อสร้างด้วยเป้าหมาย v3.2 ฉันลองเปลี่ยนขนาดเฟรมของมุมมอง UIButton แต่ดูเหมือนจะไม่ช่วยอะไรเช่นกัน ฮึ.
Dave

4
ดูวิธีแก้ปัญหาโดย Chris Nolet ด้านล่าง: button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
แมตต์

74

หากคุณกำลังจัดการกับรูปภาพของ UIButton (ตรงข้ามกับ backgroundImage) การตั้งค่า contentMode บน UIButton เองหรือบน imageView จะไม่มีผลใด ๆ (แม้ว่าจะมีคำตอบอื่น ๆ ก็ตาม)

หรือทำสิ่งนี้แทน:

self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

หรือปรับขนาดภาพของคุณให้เหมาะสม

หรือเพียงแค่ใช้ UIImageView (ซึ่งเคารพ contentMode อย่างถูกต้อง) โดยแนบ UITapGestureRecognizer หรือ UIButton แบบโปร่งใสที่ด้านบน


4
สิ่งนี้ใช้ได้กับกรณีของฉันใน iOS 7 ในขณะที่สิ่งอื่น ๆ ทั้งหมดที่นี่ไม่มี
Byte

5
การตั้งค่า contentHorizontalAlignment และ contentVerticalAlignment เป็นโซลูชันที่ถูกต้อง ดูคำอธิบายในstackoverflow.com/a/28205566/481207
Matt

1
นี่คือคำตอบที่ฉันกำลังมองหา
ninjaneer

4
คำตอบนี้ไม่ถูกต้อง คุณไม่จำเป็นต้องตั้งcontentModeบนimageViewถ้าคุณต้องการที่จะทำแบบของการเติมด้านหรือพอดีใด ๆ ตามคำตอบอื่น ๆ ได้ชี้แจง อ้างถึงstackoverflow.com/a/7944316/746890
Chris Nolet

52

แทนที่จะตั้งค่าcontentModeบนปุ่มเองคุณจะต้องตั้งค่าcontentHorizontalAlignmentและcontentVerticalAlignmentคุณสมบัติและ (สำคัญอย่างยิ่ง) contentModeสำหรับปุ่มimageViewสำหรับการเติมหรือพอดีกับลักษณะใด ๆ นี่คือตัวอย่าง:

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

แน่นอนคุณสามารถทำสิ่งอื่น ๆ ได้เช่นการจัดแนวภาพของปุ่มให้อยู่ด้านบนสุดของปุ่ม หากคุณไม่ต้องการการเติมขนาดหรือความพอดีคุณก็สามารถตั้งค่าการจัดตำแหน่งได้ด้วยตัวเอง:

button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;

ใน Swift คุณจะต้องใช้:

button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit

ซึ่งใช้ได้กับ iOS ทุกเวอร์ชันรวมถึงเวอร์ชันล่าสุดที่มีการจัดวางอัตโนมัติ (เช่น iOS 4 จนถึง iOS 11+)


2
ขอบคุณคริส - ที่แก้ไขปัญหาของฉันหรือมากกว่านั้นมันทำร่วมกับ contentEdgeInsets เพื่อที่จะถอยรูปภาพของฉันออกจากขอบด้านบนเพียงเล็กน้อย
Rob Reuss

7

หลังจากสองสามชั่วโมงแห่งความสับสนนี่คือวิธีที่ฉันทำให้มันทำงานภายใต้ iOS 3.2 ดังที่คนโง่กล่าวถึงการใช้ setBackgroundImage แทน setImage ได้ผลสำหรับฉัน

CGRect myButtonFrame = CGRectMake(0, 0, 250, 250);
UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"];

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];

[myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal];
[myButton setFrame: myButtonFrame];
[myButton setContentMode: UIViewContentModeScaleAspectFit];

6

คำตอบคือใช้ UIImageView กับการตั้งค่าโหมดเนื้อหาที่น่ารักทั้งหมดที่คุณต้องการจากนั้นวางปุ่มที่กำหนดเองไว้ด้านบน โง่ที่คุณไม่สามารถทำได้ทั้งหมดในช็อตเดียว แต่ดูเหมือนว่าคุณทำไม่ได้


4

พบวิธีแก้ไขสำหรับสิ่งนี้ ตั้งค่าadjustsImageWhenHighlightedคุณสมบัติของการUIButtonNO

  UIButton *b = [[UIButton alloc] initWithFrame:rect];
        [b setImage:image forState:UIControlStateNormal];
        [b.imageView setContentMode:UIViewContentModeScaleAspectFill];
        [b setAdjustsImageWhenHighlighted:NO];

หวังว่านี่จะช่วยได้ อย่าลังเลที่จะแสดงความคิดเห็นด้านล่างเราจะติดตามคำถามที่คุณมี


นี่คือทางออกที่สมบูรณ์แบบ
Gaurav

ไม่ทำงาน นี่เป็นเพียงการป้องกันไม่ให้ปุ่มไฮไลต์
Matt

4

คำตอบของฉันคล้ายกับของคูบา ฉันต้องการให้รูปภาพของฉันถูกตั้งค่าด้วยโปรแกรม

UIImage *image = [[UIImage alloc] initWithContentsOfFile:...];
[button setBackgroundImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill; //this is needed for some reason, won't work without it.
for(UIView *view in button.subviews) {
    view.contentMode = UIViewContentModeScaleAspectFill;
}

3

ทางออกเดียวที่เหมาะกับฉัน:

[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;


1

แทนที่จะใช้ setImage ให้ลอง setBackgroundImage


3
อืม A ที่โง่มันควรจะเคารพการตั้งค่าโหมดเนื้อหาสำหรับ CONTENT ใช่ไหม? และ B ดูเหมือนว่าจะยังไม่เคารพการตั้งค่าโหมด - ตอนนี้ถูกล็อกเป็น "ยืด" (ซึ่งในกรณีนี้จะคล้ายกับ "บีบ") และไม่ได้ปรับขนาดเนื้อหาตามแง่มุม อัตราส่วน.
Dan Ray

1

ฉันเชื่อว่าเรามีปัญหาในการสร้างอินเทอร์เฟซที่เรียบง่ายที่นี่ - ดูเหมือนว่า IB จะไม่สนใจการเปลี่ยนแปลงโหมดเนื้อหาใด ๆ หลังจากที่คุณตั้งค่าคุณสมบัติรูปภาพ

วิธีแก้ปัญหานั้นง่ายมาก: ตั้งค่าโหมดเนื้อหาลบชื่อภาพที่ตั้งไว้ก่อนหน้านี้ (ตรวจสอบให้แน่ใจว่าคุณลบออกในทุกสถานะค่าเริ่มต้นไฮไลต์ ฯลฯ ) จากนั้นป้อนชื่อภาพที่ต้องการอีกครั้งในสถานะที่ต้องการทั้งหมด - et voilà .


1
เช่นเดียวกันกับการตั้งค่าโหมดเนื้อหาโดยทางโปรแกรม - อย่าตั้งค่าภาพก่อนตั้งค่าโหมดเนื้อหา
JohnPayne

0

ฉันยังแนะนำให้ดูadjustsImageWhenHighlighted UIButtonสถานที่ให้บริการเพื่อหลีกเลี่ยงการเสียรูปทรงแปลก ๆ ของภาพเมื่อกดปุ่ม


0

ในการพยายามหาสิ่งนี้วิธีการของฉันมีแฮ็กเกอร์เล็กน้อยเมื่อเวลาผ่านไปและฉันรวม UIButton คลาสย่อยและลบล้างชุด

สำหรับฉันมันใช้งานได้เพียงแค่เคาะอัลฟาของรูปภาพให้เหลือ. 5 เพราะมันอยู่บนพื้นหลังสีดำ

อย่างไรก็ตามจะใช้งานได้ก็ต่อเมื่อฉันแสดงความคิดเห็น [super setHighlighted:] (ซึ่งดูเหมือนว่ารหัสยืดของภาพจะเกิดขึ้น) ซึ่งไม่รู้สึกว่าเป็นวิธีที่ถูกต้องในการแก้ปัญหานี้เลย ... ทุกอย่างดูเหมือนจะเป็น ทำงานได้ดีแม้ว่า เราจะดูว่ามันเป็นอย่างไรเมื่อฉันทำงานต่อไป

- (void)setHighlighted:(BOOL)highlight {
    if (highlight) {
        [self.imageView setAlpha:.5];
    }  else {
        [self.imageView setAlpha:1];        
    }

//    [super setHighlighted:highlight];
}

1
ในกรณีที่ไม่มีใครพบว่าสิ่งนี้เกี่ยวข้องวิธีการข้างต้นของฉันดูเหมือนจะใช้ได้จนกว่าฉันจะวางปุ่มบน UIScrollView ซึ่งบางครั้งไฮไลต์ของปุ่มก็ "ค้าง" ซึ่งเป็นสิ่งที่ฉันสงสัยว่าอาจเกิดขึ้นในที่สุด
jankins

0

หากใครที่กำลังมองหาคำตอบที่ใช้งานได้ใน iOS 6 และ iOS 7 และสตอรี่บอร์ด:

คุณสามารถตั้งค่าภาพในกระดานเรื่องราวของคุณ:

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

แล้ว:

for(UIView* testId in self.subviews) {
    if([testId isKindOfClass:[UIImageView class]])
        [testId setContentMode:UIViewContentModeScaleAspectFill];
}

0

หาก UIButton ดูเหมือนจะไม่รับฟังการตั้งค่าข้อ จำกัด ของเค้าโครงให้ตรวจสอบว่ารูปภาพมีขนาดใหญ่กว่าขนาดปุ่มหรือไม่ ใช้ภาพ @ 2x และ @ 3x เสมอสำหรับความละเอียดเรตินา


0

สองสิ่งนี้ (ซึ่งหาค่อนข้างยากในตอนแรก) จะขยายภาพ UIButton ของคุณให้พอดีกับขนาดปุ่ม:

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

ควรพยายามตั้งค่าดังกล่าวใน Storyboard แทนที่จะเป็นโค้ด

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