¿Cómo puedo obtener un botón de forma no rectangular?botón de iPhone con forma no rectangular?
Por ejemplo, tengo una imagen PNG con transparencia alfa. ¿Cómo puedo configurar la forma de un botón para esta imagen sin el color transparente?
¿Cómo puedo obtener un botón de forma no rectangular?botón de iPhone con forma no rectangular?
Por ejemplo, tengo una imagen PNG con transparencia alfa. ¿Cómo puedo configurar la forma de un botón para esta imagen sin el color transparente?
Al igual que los otros dicen que debe tener una superficie razonable para el registro de eventos de toque, pero estoy seguro de que saben eso, y sus razones, así que sólo voy a decir cómo lo hice:
necesitaba hacer esto no hace mucho tiempo y lo que hice es lo que Sixten Otto acaba de sugerir. Hay algunos indicios en mi pregunta original (sección "UPDATE") para obtener el valor alfa para su imagen en un momento determinado:
How to create a transparent window with non-rectangular buttons?
Editar: Sugiero la subclasificación uicontrol en el siguiente ejemplo, pero si no necesita ningún comportamiento especial en su botón, aparte de la "no-rectangularidad" de la misma, simplemente subclases un UIButton sin bordes configurado con su PNG hará el trabajo y requerirá menos trabajo. Sin embargo, tiene más control sobre el comportamiento del control subclasificando UIControl y haciéndolo de la "manera difícil".
Sugeriría la subclase UIControl
y anulará los métodos de evento táctiles, luego comprobará alfa debajo del punto tocado y no manejará el evento si alpha == 0
.Para dibujar sobrescriba drawRect:
y use el método NSImage
para dibujar su imagen en el marco del control.
primer lugar usted necesita para cargar la imagen y obtener una representación de mapa de bits de la misma:
buttonImage = [NSImage imageNamed:@"myButtonImage"];
buttonImageRep = [[buttonImage representations] objectAtIndex:0];
A continuación, se puede dibujar a la vista del control: (donde stateImage es un puntero a la imagen que debe ser elaborado en función si se presiona el botón o no)
- (void)drawRect:(NSRect)aRect {
[stateImage drawInRect:[self bounds] fromRect:NSMakeRect(0.0,0.0,[buttonImage size].width,[buttonImage size].height)
operation:NSCompositeSourceOver fraction:1.0];
}
En este momento ha dibujado su botón con su imagen png. Puede reemplazar los métodos de eventos táctiles y controlar el evento si el alfa no es 0:
NSColor *colorUnderMouse = [buttonImageRep colorAtX:mouse.x y:mouse.y];
float alpha = [colorUnderMouse alphaComponent];
Eso es lo que hice y funciona maravillosamente. ¡Espero que esto ayude!
N.B: Mi ejemplo es para Mac, pero también debería funcionar en el iPhone, quizás con algunas pequeñas modificaciones.
botones rectangulares son un tipo de botón, se puede utilizar el tipo de botón personalizado y asignar una imagen para deshacerse de los bordes rectangulares del botón ... aquí está una referencia a los tipos de botones y http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html#//apple_ref/doc/c_ref/UIButtonType a UIButton http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html
Parece que desea que el área del botón que se puede hacer clic coincida exactamente con el archivo PNG que está utilizando.
Si eso es lo que estás buscando, en primer lugar diría que no hagas eso. El iPhone se presiona con un dedo, que generalmente no tiene la precisión para distinguir una región tan pequeña.
Sin embargo, si está atascado en la idea, entonces la solución es no usar botones, en lugar de eso, maneje el clic en un cuadro principal e interprete manualmente el valor X/Y del clic para determinar si está en algún delimitación de la región (en el caso de un botón de borde redondeado, probablemente consistiría en oring el resultado de verificar 4 círculos y 2 rectángulos)
Editar: Realizando parte de su pregunta original, noté que mencionó que quería manejar el función automáticamente basada en el canal Alpha. Si bien recomendaría mi método de delimitar regiones, en teoría podría lograr esto al muestrear el PNG para probar el canal Alpha en un valor compensado por el origen del botón. Potencialmente incluso haciendo esto en un evento de clic de botón normal.
Como Guvante says, realmente no es una buena idea confiar en los toques de precisión. Apple, por ejemplo, recomienda que controls be at least 44px across.
me gustaría recomendar el uso de un tipo de UIButton
UIButtonTypeCustom
, conjunto del botón a su PNG y registro para eventos de toque (see here for more on event handling). Luego, en su método de acción, puede obtener las coordenadas del toque fuera del evento, y probar esas coordenadas contra el alfa de su imagen para ver si debe tratarlo como un toque "real" o no.
Otra opción podría ser dividir el botón en varias partes rectangulares.
@Form a la derecha sobre el uso de 'drawRect' para implementar la forma personalizada para el botón.
Pero mejor method de contacto examen dentro botón dentro o no es el uso de
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
Usted puede crear su botón transparente para toques en algunas partes.
Si la imagen personalizada no se puede utilizar para el botón (por ejemplo, si dibuja texto en el botón) que puede utilizar para dibujar nueva method subvistas jerarquía en una imagen:
- (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates;
Más detalles sobre exactamente qué lo que está buscando alcanzar puede llevarlo a donde quiera ir más rápido. – fbrereto