2012-09-23 26 views
17

Pensé desde algún punto para OS X, y siempre es cierto para iOS, que el contenido puede aparecer fuera de los límites de la vista? (Por UIView) Pero si creo una nueva vista de aplicación individual, y creé una clase MyView que las subclases de UIView, e implementar su drawRect:En iOS, drawRect no puede dibujar fuera de los límites de la vista?

- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
    UIBezierPath *path = [UIBezierPath bezierPathWithRect: 
              CGRectMake(-20, -20, 600, 600)]; 
    [[UIColor greenColor] set]; 
    [path fill]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, [[UIColor blueColor] CGColor]); 
    CGContextFillRect(context, CGRectMake(-20, -20, 600, 600)); 
} 

Puedo utilizar la interfaz de usuario y CG para dibujar un rectángulo cada uno, por si el caso uno funciona y el otro no. Y la vista se añade en viewDidAppear:

- (void)viewDidAppear:(BOOL)animated { 
    MyView *myView = [[MyView alloc] initWithFrame:CGRectMake(20, 20, 260, 260)]; 
    [self.view addSubview:myView]; 
} 

Pero no importa qué, la caja de color no irá más allá de la región (20, 20, 260, 260). ¿Es cierto que solo los CALayers pueden agregarse libremente y aparecer fuera de los límites de una vista? ¿Puede ser debido a que el contexto de los gráficos se limita a este (20, 20, 260, 260) para empezar? Si es así, ¿hay alguna manera de hacer que el contenido drawRect aparezca fuera del límite de la vista, en las cuatro direcciones arriba, abajo, izquierda, derecha?

+0

¿Puedo preguntar, por qué quiere dibujar fuera del rect visible, ya que no estará visible? Si planeas hacer que sea visible más tarde, debes usar un CALayer como mencionaste correctamente. – Lefteris

+0

Una de las razones es que estoy pensando en implementar un PopoutScrollView que tenga esquinas redondeadas o incluso "bordes tipo nube". Descubrí que puedo subclasificar UIView y tener UIScrollView como una propiedad, de modo que la vista de desplazamiento es una subvista de la vista, y de hecho tengo que anular 'addSubview' para agregarlo a' self.scrollView'. Esto se debe a que simplemente no puedo dibujar los bordes en un scrollView, o de lo contrario se desplazarán. Esto puede ser complicado, y pensé, ¿por qué no solo la subclase UIScrollView, y en drawRect, dibujar fuera de los límites? Entonces no tengo que anular tantos métodos. –

+0

Aunque no he probado esto, pero no veo una razón para que esto no funcione, agregando esquinas redondeadas a la vista de desplazamiento, a través de la propiedad scrollview.layer.cornerRadius debería hacer esto fácil para usted. Además, si planea modificar una vista de desplazamiento, debe subclasificar la vista de desplazamiento y su método drawRect, en lugar de una UIView – Lefteris

Respuesta

0

Prueba esto en una visión, en la que han añadido el ScrollView:

self.scrollView.backgroundColor = [UIColor darkGrayColor]; 
self.scrollView.layer.cornerRadius = 10.0f; 
self.scrollView.layer.masksToBounds = YES; 

Se debe mostrar una ScrollView gris con esquinas redondeadas, como se desee.

Recuerde que necesita para importar el QuartzCore FrameWork

+0

¿Qué sucede si necesita salir de los límites? –

+0

No entiendo la pregunta – Lefteris

+0

Es decir, el código anterior dibujará el fondo dentro de los límites de la vista. ¿Qué pasa si tenemos que dibujar algo 10 píxeles por encima de la parte superior, 10 píxeles a la izquierda del margen izquierdo, etc. (dibujar algo, o en este caso es dibujar el fondo y esquinas redondeadas) –

20

Su problema es que "drawRect" se recorta automáticamente a la vista que se está dibujando.

En vez de hacer el dibujo en la vista en sí , agregue una segunda (sub) vista a la primera vista, que está fuera de los límites de la primera vista. Esto le permitirá hacer un dibujo que depende de la ubicación de la primera vista, pero está fuera de los límites de la primera vista.

Espero que esto ayude.

Cuestiones relacionadas