2014-01-20 2 views
0

Я думаю, это еще один вопрос новичков, но оглядываясь на способ изменить изображения кнопок и фона кнопки, в xcode, после нажатия кнопки, Я только может найти метод setBackgroundImage: forState: UIControlStatePressed, который выглядит легко, но ограничен использованием растровой графики.Изменение формы кнопки, сделанной с кривыми Безье после давления

Я действительно не могу найти, как сделать тот же эффект, если кнопка была сделана с использованием кривых и градиентов, с UIBezierPath.

Заранее спасибо за помощь

не

Здесь я ввожу метод я положил в моем пользовательском класс Button: CButton.m Я попытался установить, если .. еще состояние, связанное с давлением кнопки, но до сих пор никаких результатов

- (void)drawRect:(CGRect)rect 

{ 

    if (UIControlEventAllTouchEvents) { 


    CGContextRef context = UIGraphicsGetCurrentContext(); 

    UIColor* color2 = [UIColor colorWithRed:0 green:0.429 blue:0.429 alpha:1]; 
    UIColor* color3 = [UIColor colorWithRed:0.8 green: 0.933 blue: 1 alpha:1]; 



    UIColor* shadow = [color2 colorWithAlphaComponent: 0.09]; 
    CGSize shadowOffset = CGSizeMake(13.1, 13.1); 
    CGFloat shadowBlurRadius = 0.5; 

    myButton = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(8, 6.5, 185, 50.8)  cornerRadius:3.1]; 
    CGContextSaveGState(context); 
    CGContextSetShadowWithColor(context, shadowOffset,shadowBlurRadius, shadow.CGColor); 
    [color3 setFill]; 
    [myButton fill]; 
    CGContextRestoreGState(context); 
    } 
    else if (!UIControlEventAllTouchEvents) { 


     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
     CGContextRef context = UIGraphicsGetCurrentContext(); 

     UIColor* color2 = [UIColor colorWithRed:1 green:0.933 blue:0.8 alpha:1]; 
     UIColor* color3 = [UIColor colorWithRed:1 green:0.114 blue:0.114 alpha:1]; 

     NSArray* gradientColors = [NSArray arrayWithObjects: 
           (id)color2.CGColor, 
           (id)[UIColor colorWithRed:1 green:0.524 blue:0.457 alpha:1].CGColor, 
           (id)color3.CGColor,nil]; 
     CGFloat gradientLocations[] = {0, 0.29, 1}; 
     CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)(gradientColors), gradientLocations); 
     myButton = [UIBezierPath bezierPathWithArcCenter:CGPointMake(32.2, 30) radius:0.5 startAngle:5 endAngle:50 clockwise:YES]; 
     [myButton moveToPoint:CGPointMake(102.5, 59)]; 
     [myButton addCurveToPoint:CGPointMake(88.5, 97) controlPoint1:CGPointMake(103.07, 64.7) controlPoint2:CGPointMake(88.5, 97)]; 
     [myButton addLineToPoint:CGPointMake(113.5, 66)]; 
     [myButton addLineToPoint:CGPointMake(144.5, 114)]; 
     [myButton addLineToPoint:CGPointMake(131.5, 59)]; 
     [myButton addLineToPoint:CGPointMake(211.5, 66)]; 
     [myButton addLineToPoint:CGPointMake(131.5, 41)]; 
     [myButton addLineToPoint:CGPointMake(126.5, 7)]; 
     [myButton addLineToPoint:CGPointMake(113.5, 41)]; 
     [myButton addLineToPoint:CGPointMake(77.5, 23)]; 
     [myButton addCurveToPoint:CGPointMake(102.5, 59) controlPoint1:CGPointMake(77.5, 23)  controlPoint2:CGPointMake(101.93, 53.3)]; 
     [myButton closePath]; 
     myButton.miterLimit = 11; 

     CGContextSaveGState(context); 
     [myButton addClip]; 
     CGContextDrawRadialGradient(context, gradient, CGPointMake(118.72, 52.63), 3.79, 
           CGPointMake(107.76, 55.37), 94.63, 
           kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation); 
     CGContextRestoreGState(context); 

     CGGradientRelease(gradient); 
     CGColorSpaceRelease(colorSpace); 
     } 
    } 


@end  

in myController У меня есть, конечно, IBActyion, чтобы обнаружить давление кнопки.

извините за мое отсутствие о соответствующих термах в объяснении, но я все еще очень новый в ObjC Заранее спасибо снова

ответ

0

использовать тот же код

- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state

Состояние контроля

Управление может иметь более одного состояния за раз. Государства признаются по-разному в зависимости от управления

enum { 
    UIControlStateNormal    = 0, 
    UIControlStateHighlighted   = 1 << 0, 
    UIControlStateDisabled    = 1 << 1, 
    UIControlStateSelected    = 1 << 2, 
    UIControlStateApplication   = 0x00FF0000, 
    UIControlStateReserved    = 0xFF000000 
}; 
+0

Thks, но я до сих пор не могу заставить его работать, может быть, я должен создать UIImage из UIBezierPath, но я не знаю как это реализовать. – user3190749

0

нормально, я решил удаление моего персональной кнопки класса и реализация «нормальное» UIButton устанавливающего UIControlState как показано в перечисление, предоставленное Ramshad. я мог реализовать также UIBezierPath загружая его в отдельный UIImage * объекта

это код, который я использовал в ViewController.m по крайней мере:

  • эту часть, чтобы установить UIImage на объект Безье

это осуществить изменение кнопки на ощупь:

-(UIImage*) preTouch{ 




CGRect rect = CGRectMake(0.0, 0.0, 100.0, 100.0); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
UIGraphicsBeginImageContext(rect.size); 

UIColor* color2 = [UIColor colorWithRed:1 green:0.933 blue:0.8 alpha:1]; 
UIColor* color3 = [UIColor colorWithRed:1 green:0.114 blue:0.114 alpha:1]; 

NSArray* gradientColors = [NSArray arrayWithObjects: 
          (id)color2.CGColor, 
          (id)[UIColor colorWithRed:1 green:0.524 blue:0.457 alpha:1].CGColor, 
          (id)color3.CGColor,nil]; 
CGFloat gradientLocations[] = {0, 1}; 
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)(gradientColors), gradientLocations); 
UIBezierPath* newBezier = [UIBezierPath bezierPath];//]WithArcCenter:CGPointMake(32.2, 30) radius:0.5 startAngle:5 endAngle:50 clockwise:YES]; 
[newBezier moveToPoint:CGPointMake(31.48, 59.3)]; 

[newBezier addLineToPoint:CGPointMake(17.81, 65.66)]; 
[newBezier addLineToPoint:CGPointMake(39.29, 67.25)]; 
[newBezier addLineToPoint:CGPointMake(51, 89.5)]; 
[newBezier addLineToPoint:CGPointMake(56.86,68.84)]; 
[newBezier addLineToPoint:CGPointMake(92, 59.3)]; 
[newBezier addLineToPoint:CGPointMake(63.69, 50.56)]; 
[newBezier addLineToPoint:CGPointMake(76.38, 0.5)]; 
[newBezier addLineToPoint:CGPointMake(51,45)]; 
[newBezier addLineToPoint:CGPointMake(31.48,16.39)]; 
[newBezier addLineToPoint:CGPointMake(39.29,45)]; 
[newBezier addLineToPoint:CGPointMake(10,35.46)]; 
[newBezier addLineToPoint:CGPointMake(31.48,59.3)]; 


[newBezier closePath]; 
newBezier.miterLimit = 18; 

[color3 setFill]; 
[newBezier fill]; 

CGContextSaveGState(context); 
[newBezier addClip]; 
CGContextDrawRadialGradient(context, gradient, CGPointMake(118.72, 52.63), 3.79, 
          CGPointMake(107.76, 55.37), 94.63, 
          kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation); 
CGContextRestoreGState(context); 

CGGradientRelease(gradient); 
CGColorSpaceRelease(colorSpace); 
CGContextAddPath(context, newBezier.CGPath); 
UIImage *buttonImage1 = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsPopContext(); 
UIGraphicsEndImageContext(); 


return buttonImage1;} 

и это установить поведение как кнопка нажата

- (IBAction)buttonPressed: (UIButton*) sender{ 


UIImage* buttonImage = [[UIImage alloc]init]; 
buttonImage = [self preTouch]; 
UIImage* myImage = buttonImage; 
[newButton setBackgroundImage: myImage forState:1 <<0]; 

Еще раз спасибо за поддержку

Смежные вопросы