Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Рамка вокруг UITextView

342
27 мая 2012 года
Yos
209 / / 21.06.2003
Так как я уже почти год пишу исключительно под iOS хочется поделиться некоторыми изысканиями. В данном случае в последнем проекте встал вопрос о том что кроме UITextField в форме необходимо вставить еще и UITextView. Но вот в чем проблема - у последнего нет рамки, и смотрится это крайне не гуд. И вопросов на эту тему столько... На англоязычных форумах предлагается либо использовать layer - но рамка совершенно не та, либо подложить заблокированный UITextField, но у него высота 31 и поправить ее можно только руками в XIB файле (там еще без подготовки попробуй разберись). Вообщем решил нарисовать сам.

Вообщем идея проста до безобразия - делаем свой собственный класс наследуемый от UITextView и заменяем у него функцию перерисовки:

.h
Код:
//
//  MultilineTextField.h
//
//  Created by Yuriy Gaytrov on 18.05.12.
//  Copyright (c) 2012 Pure Snow re:search. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

//****************************************************************
//
//
//
//****************************************************************

@interface MultilineTextField : UITextView

//****************************************************************
//
//
//
//****************************************************************

@end
.m
Код:
//
//  MultilineTextField.m
//
//  Created by Yuriy Gaytrov on 18.05.12.
//  Copyright (c) 2012 Pure Snow re:search. All rights reserved.
//

#import "MultilineTextField.h"

//****************************************************************
//
//
//
//****************************************************************

@implementation MultilineTextField

//****************************************************************
//
//
//
//****************************************************************

- (void) drawRect:(CGRect)rect
{
    //
    CGContextRef context = UIGraphicsGetCurrentContext();
   
    //
    CGContextBeginPath(context);
    CGContextSetFillColorWithColor(context, self.superview.backgroundColor.CGColor);
    CGContextAddRect(context, rect);
    CGContextFillPath(context);
       
    //
    CGContextSaveGState(context);
   
    //
    CGContextBeginPath(context);
    CGContextAddArc(context, 7, 7, 7, M_PI, M_PI+M_PI/2, 0);
    CGContextAddArc(context, rect.size.width-7, 7, 7, M_PI+M_PI/2, 0, 0);
    CGContextAddArc(context, rect.size.width-7, rect.size.height-7, 7, 0, M_PI/2, 0);
    CGContextAddArc(context, 7, rect.size.height-7, 7, M_PI/2, M_PI, 0);
    CGContextClip(context);
   
    //
    CGFloat borderLocations[2]  = { 0.00, 1.00 };
    CGFloat borderComponents[8] = { 0.55, 0.55, 0.55, 1.00, 0.85, 0.85, 0.85, 1.00 };
    //
    CGColorSpaceRef borderSpace = CGColorSpaceCreateDeviceRGB();
    CGGradientRef borderGradient = CGGradientCreateWithColorComponents(borderSpace, borderComponents, borderLocations, 2);
    CGContextDrawLinearGradient(context, borderGradient, CGPointMake(0, 0), CGPointMake(0,rect.size.height), kCGGradientDrawsBeforeStartLocation);
    //
    CGColorSpaceRelease(borderSpace);
    CGGradientRelease(borderGradient);

    //
    CGContextRestoreGState(context);   
    //
    CGContextSaveGState(context);
   
    //
    CGContextBeginPath(context);
    CGContextAddArc(context, 8, 8, 7, M_PI, M_PI+M_PI/2, 0);
    CGContextAddArc(context, rect.size.width-8, 8, 7, M_PI+M_PI/2, 0, 0);
    CGContextAddArc(context, rect.size.width-8, rect.size.height-8, 7, 0, M_PI/2, 0);
    CGContextAddArc(context, 8, rect.size.height-8, 7, M_PI/2, M_PI, 0);
    CGContextClip(context);
   
    //
    CGFloat innerLocations[3]  = { 0.00, 3.50/rect.size.height, 1.00 };
    CGFloat innerComponents[12] = { 0.55, 0.55, 0.55, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00 };
    //
    CGColorSpaceRef innerSpace = CGColorSpaceCreateDeviceRGB();
    CGGradientRef innerGradient = CGGradientCreateWithColorComponents(innerSpace, innerComponents, innerLocations, 3);
    CGContextDrawLinearGradient(context, innerGradient, CGPointMake(0, 0), CGPointMake(0,rect.size.height), kCGGradientDrawsBeforeStartLocation);
    //
    CGColorSpaceRelease(innerSpace);
    CGGradientRelease(innerGradient);
   
    //
    CGContextRestoreGState(context);   
   
    //
    [super drawRect:rect];
}

//****************************************************************
//
//
//
//****************************************************************

@end
В IB для UITextView прописываем MultilineTextField и все. А для красаты индикаторов прокрутки в контролере делаем следующее:


Код:
//****************************************************************
//
//
//
//****************************************************************

- (void) viewDidLoad
{
    //
    [super viewDidLoad];
   
    //
    self.comment.scrollIndicatorInsets = UIEdgeInsetsMake(3, 3, 3, 3);
}
Так что если кому сгодится - пользуйтесь на здоровье...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог