Program Tip

UIButton의 imageView를 어떻게 확장합니까?

programtip 2020. 10. 8. 18:51
반응형

UIButton의 imageView를 어떻게 확장합니까?


를 사용하여 이미지로 "button"이라는 UIButton 인스턴스를 만들었습니다 [UIButton setImage:forState:]. button.frame이 이미지 크기보다 큽니다.

이제이 버튼의 이미지를 더 작게 조정하겠습니다. button.imageView.frame, button.imageView.bounds및을 변경해 button.imageView.contentMode보았지만 모두 효과가없는 것 같습니다.

누구든지 UIButton의 imageView 크기를 조정할 수 있습니까 ?

나는 다음 UIButton과 같이 만들었습니다 .

UIButton *button = [[UIButton alloc] init];
[button setImage:image forState:UIControlStateNormal];

다음과 같이 이미지 크기를 조정하려고했습니다.

button.imageView.contentMode = UIViewContentModeScaleAspectFit;
button.imageView.bounds = CGRectMake(0, 0, 70, 70);

이:

button.imageView.contentMode = UIViewContentModeScaleAspectFit;
button.imageView.frame = CGRectMake(0, 0, 70, 70);

원본 포스터의 경우 내가 찾은 해결책은 다음과 같습니다.

commentButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;

이렇게하면 버튼이 수평으로 확장됩니다. 수직 설정도 있습니다.

하나를 알아내는 데 몇 시간이 걸렸 으므로 ( 부동산의 이름은 매우 직관적이지 않음) 공유 할 것이라고 생각했습니다.


비슷한 문제에 직면했습니다. 여기서 배경 이미지 (테두리가있는 이미지)와 사용자 지정 단추 용 이미지 (플래그)가 있습니다. 나는 깃발이 축소되고 중앙에 있기를 원했습니다. imageView의 속성을 변경하려고했지만 성공하지 못했고이 이미지를보고있었습니다.

여기에 이미지 설명 입력

실험하는 동안 다음을 시도했습니다.

button.imageEdgeInsets = UIEdgeInsetsMake(kTop,kLeft,kBottom,kRight)

다음과 같은 예상 결과를 얻었습니다.

여기에 이미지 설명 입력


XIB 파일의 구성을위한 추가 방법. 텍스트 또는 이미지가 UIButton에서 전체 채우기 크기 조정을 원하는 경우이 옵션을 선택할 수 있습니다. 코드도 마찬가지입니다.

UIButton *btn = [UIButton new];

btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
btn.contentVerticalAlignment   = UIControlContentVerticalAlignmentFill;

여기에 이미지 설명 입력


사용하다

button.contentMode = UIViewContentModeScaleToFill;

아니

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

최신 정보:

@Chris가 언급했듯이

setImage : forState :에 대해이 작업을 수행하려면 다음을 수행하여 수평으로 크기를 조정해야합니다. myButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;


    UIButton *button= [[UIButton alloc] initWithFrame:CGRectMake(0,0,70,70)];
    button.buttonType = UIButtonTypeCustom;
    UIImage *buttonImage = [UIImage imageNamed:@"image.png"];

    UIImage *stretchableButtonImage = [buttonImage stretchableImageWithLeftCapWidth:12 topCapHeight:0]; 
    [button setBackgroundImage:stretchableButtonImage forState:UIControlStateNormal]; 

이 해결책을 찾았습니다.

1) 다음 메서드를 하위 클래스 UIButton

+ (id)buttonWithType:(UIButtonType)buttonType {
    MyButton *toReturn = [super buttonWithType:buttonType];
    toReturn.imageView.contentMode = UIViewContentModeScaleAspectFit;
    return toReturn;
}

- (CGRect)imageRectForContentRect:(CGRect)contentRect {
    return contentRect;
}

그리고 그것은 잘 작동합니다.


이상하게도 나를 위해 일한 유일한 콤보는 (iOS 5.1) ...

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

[button setImage:newImage forState:UIControlStateNormal];


방금이 같은 문제가 발생했으며이 질문에 가능한 대답이 있습니다.

사용자 정의 UIButton 이미지가 Interface Builder에서 크기가 조정되지 않는 이유는 무엇입니까?

기본적으로 대신 backgroundimage 속성을 사용하면 크기가 조정됩니다.


그냥하세요 (디자인 또는 코드에서) :

디자인에서

  1. xib 또는 스토리 보드를 엽니 다.
  2. 선택 버튼
  3. Inside Attribute Inspector (오른쪽)> "컨트롤" 섹션에서> 수평 및 수직 모두에 대해 마지막 네 번째 옵션선택 합니다.

[포인트 # 3의 경우 : 수평 및 수직 정렬을 UIControlContentHorizontalAlignmentFill and UIControlContentVericalAlignmentFill]

코드에서

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

이렇게하면 문제를 해결할 수 있습니다.

+ (UIImage*)resizedImage:(UIImage*)image
{
 CGRect frame = CGRectMake(0, 0, 60, 60);
 UIGraphicsBeginImageContext(frame.size);
 [image drawInRect:frame];
 UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

 return resizedImage;
}

여기서 읽은 후 방금 한 작은 테스트에서 setImage 또는 setBackgroundImage를 사용하는지 여부에 따라 모두 동일한 결과를 수행하고 이미지를 strech합니다.

//for setBackgroundImage
 self.imageButton.contentMode = UIViewContentModeScaleAspectFill;
        [self.imageButton setBackgroundImage:[UIImage imageNamed:@"imgFileName"] forState:UIControlStateNormal];

//for setImage
 self.imageButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
        self.imageButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
    [self.imageButton setImage:[UIImage imageNamed:@"imgFileName"] forState:UIControlStateNormal];

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

backgroundImage가 자동으로 크기 조정되기 때문에이 방법도 작동합니다.

[button setBackgroundImage:image forState:UIControlStateNormal];


_imageView에서 솔루션을 사용할 수는 없지만 a CGContextRef사용 하여 해결할 수 있습니다. 를 사용하여 UIGraphicsGetCurrentContextcurrentContextRef를 가져오고 currentContextRef에 이미지를 그린 다음 이미지의 크기를 조정하거나 회전하고 새 이미지를 만듭니다. 그러나 그것은 완벽하지 않습니다.

코드:

-(UIImage*) scaleAndRotateImage:(UIImage*)photoimage width:(CGFloat)bounds_width height:(CGFloat)bounds_height;
{
    CGImageRef imgRef = photoimage.CGImage;

    CGFloat width = CGImageGetWidth(imgRef);
    CGFloat height = CGImageGetHeight(imgRef);

    CGAffineTransform transform = CGAffineTransformIdentity;
    CGRect bounds = CGRectMake(0, 0, width, height);

    bounds.size.width = bounds_width;
    bounds.size.height = bounds_height;

    CGFloat scaleRatio = bounds.size.width / width;
    CGFloat scaleRatioheight = bounds.size.height / height;
    CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
    CGFloat boundHeight;
    UIImageOrientation orient = photoimage.imageOrientation;
    switch(orient)
    {
        case UIImageOrientationUp: //EXIF = 1
            transform = CGAffineTransformIdentity;
            break;

        case UIImageOrientationUpMirrored: //EXIF = 2
            transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            break;

        case UIImageOrientationDown: //EXIF = 3
            transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;

        case UIImageOrientationDownMirrored: //EXIF = 4
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
            transform = CGAffineTransformScale(transform, 1.0, -1.0);
            break;

        case UIImageOrientationLeftMirrored: //EXIF = 5
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationLeft: //EXIF = 6
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationRightMirrored: //EXIF = 7
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeScale(-1.0, 1.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        case UIImageOrientationRight: //EXIF = 8
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        default:
            [NSException raise:NSInternalInconsistencyException format:@"Invalid?image?orientation"];
            break;
    }

    UIGraphicsBeginImageContext(bounds.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft)
    {
        CGContextScaleCTM(context, -scaleRatio, scaleRatioheight);
        CGContextTranslateCTM(context, -height, 0);
    }
    else
    {
        CGContextScaleCTM(context, scaleRatio, -scaleRatioheight);
        CGContextTranslateCTM(context, 0, -height);
    }

    CGContextConcatCTM(context, transform);

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
    UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return imageCopy;
}

스토리 보드

Identity inspector런타임 속성 에서 특정 속성을 정의해야합니다 . 여기서 enum 위치에 상대적으로 값을 설정합니다 . 1은 scaleAspectFit을 의미 합니다 .imageView.contentModelrawValueUIViewContentMode

Storyboard에서 button.imageView.contentMode 설정

그리고 속성 관리자 에서 버튼의 정렬 :

버튼 전체 정렬


다른 사람에게 도움이되기를 바랍니다.

Swift 3+

button.contentHorizontalAlignment = UIControlContentHorizontalAlignment.fill
button.contentVerticalAlignment =  UIControlContentVerticalAlignment.fill

모든 UIButton에는 하나의 숨겨진 UIImageView가 있습니다. 따라서 아래와 같이 콘텐츠 모드를 설정해야합니다.

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

XCode 8의 스크린 샷

스크린 샷 왼쪽 하단에서 Stretching 속성을 볼 수 있습니다. 그것들을 사용해보십시오.

참고 URL : https://stackoverflow.com/questions/1957317/how-do-i-scale-a-uibuttons-imageview

반응형