Как сделать круговой UIView

Я хочу сделать UIView или UIImageView кругом. Или круг, размер которого я могу изменить с помощью ползунка и цвет с помощью средства выбора.


person Jab    schedule 10.12.2009    source источник
comment
Этот контроль качества НЕВЕРОЯТНО СТАРЫЙ. Имейте в виду, что в наши дни вы очень просто используете @IBDesignable, и это тривиально. Наслаждаться!   -  person Fattie    schedule 27.07.2016
comment
@JoeBlow, если я не пропущу его, я не вижу здесь ответа @IBDesignable. Можете ли вы добавить свой?   -  person pkamb    schedule 29.11.2016


Ответы (6)


Как упоминалось в некоторых комментариях, @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
    }
}

Выберите UIImageView в InterfaceBuilder и измените класс с UIImageView на пользовательский RoundedImageView:

введите описание изображения здесь

Установите Clip to Bounds в true (иначе изображение выйдет за пределы круга):

введите описание изображения здесь

Теперь он должен округляться прямо здесь, в InterfaceBuilder, что довольно изящно. Обязательно установите одинаковые значения ширины и высоты, иначе он будет иметь форму дирижабля!

введите описание изображения здесь

person James Toomey    schedule 06.07.2017

По крайней мере, я могу показать вам ярлык для рисования кругов произвольного размера. Не требуется ни OpenGL, ни отрисовка базовой графики.

Импортируйте платформу QuartzCore, чтобы получить доступ к свойству .cornerRadius вашего UIView или UIImageView.

#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 и диаметр. В этом примере предполагается, что у вас есть UIImageView с именем "circ", добавленный в качестве подпредставления к вашему представлению. У него должен быть установлен backgroundColor, чтобы вы могли его видеть.

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

Он обрабатывает только UIImageViews, но вы можете обобщить его на любой UIView.

ПРИМЕЧАНИЕ. Начиная с iOS 7, clipToBounds должен иметь значение YES.

person willc2    schedule 13.12.2009
comment
эй, @willc2, у меня это не работает. Я создал собственный tableViewCell и добавил в ячейку 4 изображения. и используйте свой метод в cellForRowAtIndexPath, но он только изменяет размер изображений. Я не вижу закругленных углов, что я делаю неправильно? - person Bonnie; 14.09.2012
comment
@BOnnie Вы должны опубликовать как новый вопрос. Это даст вам место для описания вашей установки, и гораздо больше людей смогут ее увидеть. - person willc2; 19.09.2012
comment
@Bonnie: я знаю, что это старо, но для всех, кто сталкивался с этим, вам нужно установить roundedView.clipsToBounds = YES; - person akdsouza; 17.07.2013
comment
Установите toDiameter на 50.0, чтобы представление не увеличивалось больше, чем его первоначальный размер - небольшой полезный совет :) - person Supertecnoboff; 14.06.2015

Если кто-то ищет эквивалент Swift, ниже приведен ответ (Xcode7.2):

(Чтобы это работало, высота и ширина должны быть равны.)

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

введите здесь описание изображения

person पवन    schedule 28.01.2016
comment
Какова цель этого кода? думаю ненужно!! let cntr:CGPoint = self.center self.center = cntr - person Dhaval H. Nena; 31.05.2016
comment
@Joe Blow лично я не предпочитаю раскадровку или перо, потому что вам нужно жестко закодировать высоту и ширину представления и нужно знать заранее. Если вы принимаете и масштабируете представление с другим размером и ориентацией устройства, подход Interface Builder может сломаться. - person पवन; 26.07.2016
comment
Привет, этот QA крайне устарел. Единственное решение в наши дни — использовать IBDesignable. Сегодня это абсолютно банально. - person Fattie; 26.07.2016
comment
Я также удалил свой комментарий о подходе к раскадровке, так как он полностью устарел. Ваше здоровье. (Чтобы сделать это в настоящее время, вы просто набираете @IBDesignable, и работа сделана!) - person Fattie; 27.07.2016
comment
@Марин, рад узнать, что смог тебе помочь :) - person पवन; 01.02.2017

Нет необходимости в графических вызовах. Просто установите угловой радиус равным ширине / 2. Это можно сделать для любого визуального объекта, т.е. UI элемента.

person infiniteLoop    schedule 16.05.2013

Аккуратное, чистое и элегантное решение состоит в том, чтобы создать класс с именем RoundedUIView и выбрать его в качестве пользовательского класса вашего элемента UIView в Identity Inspector Xcode, как показано на прикрепленном снимке экрана.

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, чтобы они выглядели так:

введите описание изображения здесь

person zeeshan    schedule 10.05.2020

Вам нужно сделать прозрачный UIView (альфа цвета фона равна 0), а затем в его drawRect: нарисовать свой круг с помощью вызовов CoreGraphics. Вы также можете отредактировать слой представления и присвоить ему угловой радиус.

person Ben Gottlieb    schedule 10.12.2009