ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 2

Закругление углов у UIView

Вы наверняка замечали как красиво выглядит кнопка, которая имеет тип UIButtonTypeRoundedRect. Она имеет закругленныей и это уберается лишнюю остроту в интерфейсе.

 

В это примере мы научимся закруглять углы всем объектам, которые имеют тип UIView или унаследованы от него. Для начала я предлагаю создать новый проект на основе представления (View-based Application). Я назвал свой проект Round. Я предлагаю добавить в проект вот эту картинку. Содержание картинки не имеет значения, нам главное, чтобы она имела острые углы.

Теперь добавим на интерфейс (в файл RoundViewController.xib) три объекта (UIButton, UIImageView и UIView). Для кнопки и представления картинки установим ту картинку, которую мы добавили в проект. В результате у вас должна получиться следующая картинка:

 

 

Свяжем эти объекты с кодом, чтобы мы могли к ним обращаться. Для этого изменим интерфейс класса RoundViewController:

<code data-result="[object Object]">#import &lt;UIKit/UIKit.h&gt;

@interface RoundViewController : UIViewController {
    UIButton *roundButton;
    UIImageView *roundImageView;
    UIView *roundView;
}

@property (nonatomic, retain) IBOutlet UIButton *roundButton;
@property (nonatomic, retain) IBOutlet UIImageView *roundImageView;
@property (nonatomic, retain) IBOutlet UIView *roundView;

@end</code>

 

Соответственно, изменим реализацию класса:

<code data-result="[object Object]">#import "RoundViewController.h"

@implementation RoundViewController

@synthesize roundButton;
@synthesize roundImageView;
@synthesize roundView;

- (void)dealloc
{
    self.roundButton = nil;
    self.roundImageView = nil;
    self.roundView = nil;
    [super dealloc];
}

- (void)viewDidUnload
{
    self.roundButton = nil;
    self.roundImageView = nil;
    self.roundView = nil;
    [super viewDidUnload];
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
}

@end</code>

 

Свяжем объекты кода с объектами интерфейса:

Как добавлять объекты в интерфейс и связывать их с кодом мы уже рассматривали здесь.

Осталось дело за малым, непосредственно закруглять углы нашим объектам. Для этого следует добавить в проект фреймверк QuartzCore. Как работать с Frameworks было описано в уроке Добавляем в проект Framework. Импортируем только что добавленный фреймверк в интерфейс класса RoundViewController и объявим метод, с помощью которого будем закруглять углы:

 

<code data-result="[object Object]">#import &lt;UIKit/UIKit.h&gt;
#import &lt;QuartzCore/QuartzCore.h&gt;

@interface RoundViewController : UIViewController {
    UIButton *roundButton;
    UIImageView *roundImageView;
    UIView *roundView;
}

@property (nonatomic, retain) IBOutlet UIButton *roundButton;
@property (nonatomic, retain) IBOutlet UIImageView *roundImageView;
@property (nonatomic, retain) IBOutlet UIView *roundView;

- (void)roundMyView:(UIView*)view 
       borderRadius:(CGFloat)radius 
        borderWidth:(CGFloat)border 
              color:(UIColor*)color;

@end</code>

 

Теперь добавим реализацию этого метода и применим его к нашим элементам интерфейса в методе viewDidLoad:

 

<code data-result="[object Object]">#import "RoundViewController.h"

@implementation RoundViewController

@synthesize roundButton;
@synthesize roundImageView;
@synthesize roundView;

- (void)dealloc
{
    self.roundButton = nil;
    self.roundImageView = nil;
    self.roundView = nil;
    [super dealloc];
}

- (void)viewDidUnload
{
    self.roundButton = nil;
    self.roundImageView = nil;
    self.roundView = nil;
    [super viewDidUnload];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self roundMyView:roundButton borderRadius:5.0f borderWidth:2.0f color:[UIColor blueColor]];
    [self roundMyView:roundImageView borderRadius:10.0f borderWidth:0.0f color:nil];
    [self roundMyView:roundView borderRadius:10.0f borderWidth:10.0f color:nil];
}

- (void)roundMyView:(UIView*)view 
       borderRadius:(CGFloat)radius 
        borderWidth:(CGFloat)border 
              color:(UIColor*)color 
{
    CALayer *layer = [view layer];
    layer.masksToBounds = YES;
    layer.cornerRadius = radius;
    layer.borderWidth = border;
    layer.borderColor = color.CGColor;
}

@end</code>

 

Как видите, метод не хитрый и кода не много. Он ничего не возвращает, принимает лишь объект интерфейса и значения округления (радиус, толщину и цвет границы). Заминка может быть лишь с цветом, это не обычный UIColor, а CGColorRef. Но даже здесь все интуитивно понятно. В строке {0.0f, 0.0f, 0.67f, 1.0f} подразумевается, что это {CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha}, главное не забыть очистить память после создания объекта типа CGColorRef. В результате выполнения нашего кода получим преобразованный интерфейс.

 

 

Как видите, у нас есть возможность не только создавать объекты похоже на стандартные, но и кастомизировать их, делать уникальными. Исходный код этого проекта можно скачать здесь.