【问题标题】:How to make a circular UIView如何制作圆形 UIView
【发布时间】:2010-12-25 02:47:22
【问题描述】:

我想制作一个圆形的 UIView 或 UIImageView。或者一个我可以使用滑块更改大小的圆圈,以及使用pickerview的颜色。

【问题讨论】:

  • 这个 QA 非常老。请注意,这些天您非常简单地使用“@IBDesignable”并且它是微不足道的。享受吧!
  • @JoeBlow 除非我错过了它,否则我在这里看不到“@IBDesignable”Answer。可以加你的吗?

标签: iphone uiview uiimageview geometry quartz-core


【解决方案1】:

我至少可以向您展示绘制任意大小圆的快捷方式。无需 OpenGL,无需绘制核心图形。

导入 QuartzCore 框架以访问 UIView 或 UIImageView 的 .cornerRadius 属性。

#import <QuartzCore/QuartzCore.h>

也可以手动将其添加到项目的 Frameworks 文件夹中。

将此方法添加到您的视图控制器或您需要的任何地方:

-(void)setRoundedView:(UIImageView *)roundedView toDiameter:(float)newSize;
{
    CGPoint saveCenter = roundedView.center;
    CGRect newFrame = CGRectMake(roundedView.frame.origin.x, roundedView.frame.origin.y, newSize, newSize);
    roundedView.frame = newFrame;
    roundedView.layer.cornerRadius = newSize / 2.0;
    roundedView.center = saveCenter;
}

要使用它,只需传递一个 UIImageView 和一个直径。这个例子假设你有一个名为“circ”的 UIImageView 作为子视图添加到你的 view。它应该设置一个 backgroundColor 以便您可以看到它。

circ.clipsToBounds = YES;
[self setRoundedView:circ toDiameter:100.0];

这只是处理 UIImageViews 但您可以将其推广到任何 UIView

注意:从 iOS 7 开始,clipToBounds 需要为 YES。

【讨论】:

  • 嘿@willc2 它不适合我。我创建了一个自定义 tableViewCell 并向单元格添加了 4 个 imageViews。并在 cellForRowAtIndexPath 中使用你的方法,但它只会改变我看不到圆角的 imageViews 的大小,我做错了什么?
  • @BOnnie 您应该作为一个新问题发布。这将为您提供描述您的设置的空间,并且更多的人将能够看到它。
  • @Bonnie :我知道这很旧,但对于遇到此问题的其他人,您需要设置 roundedView.clipsToBounds = YES;
  • toDiameter 设置为 50.0 以防止视图变得大于其原始大小 - 一个方便的小技巧 :)
【解决方案2】:
// For those looking to round the corners of an image view
imageView.layer.cornerRadius = imageView.bounds.size.width/2;
imageView.layer.masksToBounds = YES;

【讨论】:

  • 简单直接的目标!
【解决方案3】:

如果有人正在寻找与以下等效的 Swift,则答案是 (Xcode7.2):

(为此,高度和宽度必须相等。)

extension UIView {
    func makeCircular() {
        self.layer.cornerRadius = min(self.frame.size.height, self.frame.size.width) / 2.0
        self.clipsToBounds = true
    }
}

【讨论】:

  • 这段代码的目的是什么?我觉得没必要!! let cntr:CGPoint = self.center self.center = cntr
  • @Joe Blow 个人我不喜欢故事板或 nib 方式,因为您需要对视图的高度和宽度进行硬编码,并且需要提前知道。如果您采用和缩放具有不同设备尺寸和方向的视图,那么 Interface Builder 方法可能会中断。
  • 嗨,这个 QA 已经过时了。目前唯一的解决方案是使用 IBDesignable。今天绝对是微不足道的。
  • 我还删除了我对“in-storyboard”方法的评论,因为它已经完全过时了。干杯。 (现在要做到这一点,您只需输入“@IBDesignable”即可完成工作!)
  • @Marin,很高兴知道我可以帮助你:)
【解决方案4】:

正如在一些 cmets 中提到的,@IBDesignable 现在让这变得更容易了,所以你可以使用 Interface Builder 来配置你的圆形 UIImageView。

首先创建一个名为RoundedImageView.swift 的类并将此代码粘贴到其中:

import UIKit

@IBDesignable public class RoundedImageView: UIImageView {

    override public func layoutSubviews() {
        super.layoutSubviews()

        //hard-coded this since it's always round
        layer.cornerRadius = 0.5 * bounds.size.width
    }
}

在 InterfaceBuilder 中选择 UIImageView 并将类从 UIImageView 更改为自定义 RoundedImageView:

Clip to Bounds设置为true(否则图片会超出圆圈):

它现在应该在 InterfaceBuilder 中自行环绕,这非常漂亮。请务必将宽度和高度设置为相同的值,否则它会像飞艇一样!

【讨论】:

    【解决方案5】:

    无需图形调用。只需将角半径设置为宽度 / 2。这可以在任何视觉对象上完成,即 UI 元素

    【讨论】:

      【解决方案6】:

      一个简洁、干净和优雅的解决方案是创建一个名为 RoundedUIView 的类,并在 Xcode 的 Identity Inspector 中选择它作为 UIView 元素的自定义类,如所附屏幕截图所示。

      import UIKit
      
      @IBDesignable public class RoundedUIView: UIView {
      
          override public func layoutSubviews() {
              super.layoutSubviews()
      
              self.layer.cornerRadius = self.frame.width / 2;
              self.layer.masksToBounds = true
          }
      }
      

      由于应用程序本身具有绿色主题,因此我需要在白色背景的各种屏幕上显示多个彩色图标。所以我把我的UIImgeView 放在RoundedUIView 上面,让它们看起来像这样:

      【讨论】:

        【解决方案7】:

        您需要制作一个透明的 UIView(背景颜色 alpha 为 0),然后在其 drawRect: 中使用 CoreGraphics 调用绘制您的圆圈。您还可以编辑视图的图层,并给它一个cornerRadius。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-03
          • 1970-01-01
          相关资源
          最近更新 更多