[ios] 성능 저하없이 UITableView의 원형 UIImageView?

나는이 UIImageView내의 각 UITableView디스플레이 원격 이미지 (사용하는 것으로, 세포 SDWebImage). 다음 QuartzCore과 같이 이미지보기에 레이어 스타일을 지정했습니다.

UIImageView *itemImageView = (UIImageView *)[cell viewWithTag:100];
    itemImageView.layer.borderWidth = 1.0f;
    itemImageView.layer.borderColor = [UIColor concreteColor].CGColor;
    itemImageView.layer.masksToBounds = NO;
    itemImageView.clipsToBounds = YES;

이제 희미한 회색 테두리가있는 50×50 정사각형이 있지만 정사각형 대신 원형으로 만들고 싶습니다. 이 앱 Hemoglobe은 테이블 뷰에서 원형 이미지를 사용하며, 이것이 제가 달성하고 싶은 효과입니다. 그러나 cornerRadius스크롤링 FPS가 저하되므로을 사용하고 싶지 않습니다 .

다음은 Hemoglobe원형을 보여줍니다 UIImageViews.

여기에 이미지 설명 입력

이 효과를 얻을 수있는 방법이 있습니까? 감사.



답변

cornerRadius너비 또는 높이의 절반으로 설정하기 만하면됩니다 (개체보기가 정사각형이라고 가정).

예를 들어 개체보기의 너비와 높이가 모두 50 인 경우 :

itemImageView.layer.cornerRadius = 25;

업데이트-사용자 atulkhatri가 지적했듯이 다음을 추가하지 않으면 작동하지 않습니다.

itemImageView.layer.masksToBounds = YES;


답변

테두리를 추가하려면

self.ImageView.layer.borderWidth = 3.0f;

self.ImageView.layer.borderColor = [UIColor whiteColor].CGColor;

원형 용

self.ImageView.layer.cornerRadius = self.ImageView.frame.size.width / 2;
self.ImageView.clipsToBounds = YES;

이 링크 참조

http://www.appcoda.com/ios-programming-circular-image-calayer/


답변

이 코드를 사용하십시오 .. 도움이 될 것입니다 ..

    UIImage* image = ...;
    UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0);
    // Add a clip before drawing anything, in the shape of an rounded rect
    [[UIBezierPath bezierPathWithRoundedRect:imageView.bounds
                                cornerRadius:50.0] addClip];
    // Draw your image
    [image drawInRect:imageView.bounds];

    // Get the image, here setting the UIImageView image
    imageView.image = UIGraphicsGetImageFromCurrentImageContext();

    // Lets forget about that we were drawing
    UIGraphicsEndImageContext();

그것은 나를 위해 잘 작동합니다. 🙂


답변

다음은 IBDesignable 및 IBInspectable을 사용하여 UIImageView를 하위 클래스로 만드는 최신 방법입니다.

@IBDesignable class RoundableUIImageView: UIImageView {
    private var _round = false
    @IBInspectable var round: Bool {
        set {
            _round = newValue
            makeRound()
        }
        get {
            return self._round
        }
    }
    override internal var frame: CGRect {
        set {
            super.frame = newValue
            makeRound()
        }
        get {
            return super.frame
        }

    }

    private func makeRound() {
        if self.round == true {
            self.clipsToBounds = true
            self.layer.cornerRadius = (self.frame.width + self.frame.height) / 4
        } else {
            self.layer.cornerRadius = 0
        }
    }

    override func layoutSubviews() {
            makeRound()
    }
}


답변

네, 제공 할 수 있습니다 layer.cornerRadius (추가해야
#import <QuartzCore/QuartzCore.h>)

모든 컨트롤을 원형 만들뿐만 귀하의 경우 대신 세트를 layerUIImageView이 원형으로 이미지를 만들고 그것을 추가하는 가장 좋은 방법은 UIImageView어떤이 backGroundColor있다 ClearColor.

이 두 가지 코드 소스도 참조하십시오.

https://www.cocoacontrols.com/controls/circleview

https://www.cocoacontrols.com/controls/mhlazytableimages

이것은 귀하의 경우에 도움이 될 수 있습니다.


답변

UIImageView의 높이와 너비를 동일하게 설정하십시오 (예 : Height=60& Width = 60). 그러면 cornerRadius정확히 절반이어야합니다.

 self.imageView.layer.cornerRadius = 30;
 self.imageView.layer.borderWidth = 3;
 self.imageView.layer.borderColor = [UIColor whiteColor].CGColor;
 self.imageView.layer.masksToBounds = YES;


답변

일부 자동 레이아웃과 다른 셀 높이를 사용하는 경우 다음과 같이하는 것이 좋습니다.

   override func layoutSubviews() {
        super.layoutSubviews()
        logo.layer.cornerRadius = logo.frame.size.height / 2;
        logo.clipsToBounds      = true;
    }