Difference between revisions of "UIView"

From iPhone Development Wiki
Jump to: navigation, search
m (frame and bounds)
m (Added some 3.2 animation methods.)
Line 7: Line 7:
 
{{Function signature
 
{{Function signature
 
|signature=-(NSString*)recursiveDescription;
 
|signature=-(NSString*)recursiveDescription;
|firmware=3.0 – 3.1
+
|firmware=3.0 –
 
}}
 
}}
 
Returns the description of the view and its subviews.
 
Returns the description of the view and its subviews.
Line 21: Line 21:
 
{{Function signature
 
{{Function signature
 
|signature=-(NSDictionary*)scriptingInfoWithChildren;
 
|signature=-(NSDictionary*)scriptingInfoWithChildren;
|firmware=2.0 – 3.1
+
|firmware=2.0 –
 
}}
 
}}
  
Line 80: Line 80:
 
| <tt>__animate;</tt>
 
| <tt>__animate;</tt>
 
|}
 
|}
In above, <tt>__currentViewAnimationState</tt> is a global variable, which is a UIViewAnimationState. This value is automatically updated after calling +pushViewAnimationState:context: and +popAnimationState. NULL checks were omitted in the above codes for simplicity.
+
In above, <tt>__currentViewAnimationState</tt> is a global variable, which is a [[UIViewAnimationState]]. This value is automatically updated after calling <tt>+pushViewAnimationState:context:</tt> and <tt>+popAnimationState</tt>. NULL checks were omitted in the above codes for simplicity.
  
 
There are also a few undocumented methods:
 
There are also a few undocumented methods:
Line 90: Line 90:
 
| <tt>[UIView beginAnimations:</tt>''identifier''<tt>];</tt>
 
| <tt>[UIView beginAnimations:</tt>''identifier''<tt>];</tt>
 
| <tt>[UIView beginAnimations:</tt>''identifier''<tt> context:NULL];</tt>
 
| <tt>[UIView beginAnimations:</tt>''identifier''<tt> context:NULL];</tt>
|-
 
| <tt>[UIView _pendingAnimations];</tt>
 
| <tt>__currentViewAnimationState != nil;</tt>
 
 
|-
 
|-
 
| <tt>[UIView setAnimationPosition:</tt>''position''<tt>];</tt>
 
| <tt>[UIView setAnimationPosition:</tt>''position''<tt>];</tt>
Line 111: Line 108:
 
| <tt>[UIView setAnimationRoundsToInteger:</tt>''rounds''<tt>];</tt>
 
| <tt>[UIView setAnimationRoundsToInteger:</tt>''rounds''<tt>];</tt>
 
| <tt>__currentViewAnimationState->_roundsToInteger = </tt>''rounds''<tt>;</tt>
 
| <tt>__currentViewAnimationState->_roundsToInteger = </tt>''rounds''<tt>;</tt>
 +
|-
 +
| <tt>[UIView _isInAnimationBlock];</tt><ref><tt>+_isInAnimationBlock</tt> was named as <tt>+_pendingAnimations</tt> prior to 3.2</ref>
 +
| <tt>__currentViewAnimationState != nil;</tt>
 +
|-
 +
| <tt>[UIView _setAnimationAttributes:</tt>''attr''<tt>];</tt><ref name="3.2">These methods are available since 3.2.</ref>
 +
| <tt>[__currentViewAnimationState setAnimationAttributes:</tt>''attr''<tt>];</tt>
 +
|-
 +
| <tt>[UIView _setAnimationFilter:</tt>''filter''<tt> forView:</tt>''view''<tt>];</tt><ref name="3.2"/>
 +
| <tt>__currentViewAnimationState-&gt;_filter = </tt>''filter''<tt>;<br />__currentViewAnimationState-&gt;_filterView = [</tt>''view''<tt> retain];</tt>
 +
|-
 +
| <tt>[UIView _setAnimationFilterValue:</tt>''value''<tt>];</tt><ref name="3.2"/>
 +
| <tt>__currentViewAnimationState-&gt;_filterValue = </tt>''value''<tt>;</tt>
 
|}
 
|}
  
 
There are also a few equivalent (probably deprecated) selectors:
 
There are also a few equivalent (probably deprecated) selectors:
* +endAnimations = +commitAnimations
+
{| class="wikitable"
* +setAnimationAutoreverses: = +setAnimationRepeatAutoreverses:
+
|-
* +setAnimationFromCurrentState: = +setAnimationBeginsFromCurrentState:
+
! Selector !! Equivalent to
 +
|-
 +
| <tt>+endAnimations</tt> || <tt>+commitAnimations</tt>
 +
|-
 +
| <tt>+setAnimationAutoreverses:</tt> || <tt>+setAnimationRepeatAutoreverses:</tt>
 +
|-
 +
| <tt>+setAnimationFromCurrentState:</tt> || <tt>+setAnimationBeginsFromCurrentState:</tt>
 +
|}
  
 
== frame and bounds ==
 
== frame and bounds ==
Line 128: Line 144:
  
 
== References ==
 
== References ==
 +
<references />
 
* Official documentation: {{sdklink|UIKit|UIView}}
 
* Official documentation: {{sdklink|UIKit|UIView}}
 
{{IPFHeader|UIKit|3=2}}
 
{{IPFHeader|UIKit|3=2}}

Revision as of 11:02, 6 February 2010

UIView is the root class of all UI elements.

Getting View Hierarchy Info

There are 2 ways of getting the view hierarchy info, the "human readable" -[UIView recursiveDescription] and "machine readable" -[UIView scriptingInfoWithChildren].

-recursiveDescription

Signature -(NSString*)recursiveDescription;
Available in 3.0 –

Returns the description of the view and its subviews.

Example output:

<UIWebView: 0x4116bb0; frame = (0 100; 320 230); layer = <CALayer: 0x4116c20>>
   <UIScroller: 0x411e110; frame = (0 0; 320 230); clipsToBounds = YES; autoresize = H; layer = <CALayer: 0x411e4d0>>
       <UIImageView: 0x411f460; frame = (0 0; 54 54); transform = [-1, 0, -0, -1, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x411f490>>
       <UIWebDocumentView: 0x4812c00; frame = (0 0; 320 230); layer = <UIWebLayer: 0x41171c0>>

-scriptingInfoWithChildren

Signature -(NSDictionary*)scriptingInfoWithChildren;
Available in 2.0 –

This function returns an NSDictionary with contains some information e.g. geometry, class name, etc.

Animation Blocks

Animation blocks are implemented by the UIViewAnimationState class with the following correspondences:

UIView methods Equivalent call
[UIView beginAnimations:identifier context:context]; [UIViewAnimationState pushViewAnimationState:identifier context:context];
[UIView commitAnimations]; [UIViewAnimationState popAnimationState];
[UIView setAnimationStartDate:date]; __currentViewAnimationState->_start = [date timeIntervalSinceReferenceDate];
[UIView setAnimationsEnabled:enabled]; __animate = enabled;
[UIView setAnimationDelegate:delegate]; if (__currentViewAnimationState->_delegate != delegate) {
  [__currentViewAnimationState->_delegate release];
  __currentViewAnimationState->_delegate = [
delegate retain];
}
[UIView setAnimationWillStartSelector:selector]; __currentViewAnimationState->_willStartSelector = selector;
[UIView setAnimationDidStopSelector:selector]; __currentViewAnimationState->_didEndSelector = selector;
[UIView setAnimationDuration:duration]; __currentViewAnimationState->_duration = duration;
[UIView setAnimationDelay:delay]; __currentViewAnimationState->_delay = delay;
[UIView setAnimationCurve:curve]; __currentViewAnimationState->_curve = curve;
[UIView setAnimationRepeatCount:repeatCount]; __currentViewAnimationState->_repeatCount = repeatCount;
[UIView setAnimationRepeatAutoreverses:autoreverses]; __currentViewAnimationState->_autoreverses = autoreverses;
[UIView setAnimationBeginsFromCurrentState:value]; __currentViewAnimationState->_useCurrentLayerState = value;
[UIView setAnimationTransition:transVal forView:container cache:cache]; __currentViewAnimationState->_transition = transVal;
__currentViewAnimationState->_transitionView = [
container retain];
__currentViewAnimationState->_cacheTransition =
cache;
[UIView areAnimationsEnabled]; __animate;

In above, __currentViewAnimationState is a global variable, which is a UIViewAnimationState. This value is automatically updated after calling +pushViewAnimationState:context: and +popAnimationState. NULL checks were omitted in the above codes for simplicity.

There are also a few undocumented methods:

UIView method Equivalent call
[UIView beginAnimations:identifier]; [UIView beginAnimations:identifier context:NULL];
[UIView setAnimationPosition:position]; __currentViewAnimationState->_position = position;
[UIView disableAnimation]; __animate = NO;
[UIView enableAnimation]; __animate = YES;
[UIView setAnimationFrameInterval:interval]; __currentViewAnimationState->_frameInterval = interval;
[UIView setAnimationStartTime:time]; __currentViewAnimationState->_start = time;
[UIView setAnimationRoundsToInteger:rounds]; __currentViewAnimationState->_roundsToInteger = rounds;
[UIView _isInAnimationBlock];[1] __currentViewAnimationState != nil;
[UIView _setAnimationAttributes:attr];[2] [__currentViewAnimationState setAnimationAttributes:attr];
[UIView _setAnimationFilter:filter forView:view];[2] __currentViewAnimationState->_filter = filter;
__currentViewAnimationState->_filterView = [
view retain];
[UIView _setAnimationFilterValue:value];[2] __currentViewAnimationState->_filterValue = value;

There are also a few equivalent (probably deprecated) selectors:

Selector Equivalent to
+endAnimations +commitAnimations
+setAnimationAutoreverses: +setAnimationRepeatAutoreverses:
+setAnimationFromCurrentState: +setAnimationBeginsFromCurrentState:

frame and bounds

frame and bounds are both properties of a UIView. When the view's transform is not identity, the only difference between them is the origin of bounds is always zero.

When transform is not identity, the SDK documentation warns that frame is undefined:

Warning: If the transform property is not the identity transform, the value of this property is undefined and therefore should be ignored.

but this is not completely true — the frame is actually the rectangle enclosing the transformed view.

These properties are actually proxies to the corresponding ones of CALayer. However, while the bounds (and center) is an internal property, frame incurs a transactional lock (spin lock) and an affine transform.

References

  1. +_isInAnimationBlock was named as +_pendingAnimations prior to 3.2
  2. 2.0 2.1 2.2 These methods are available since 3.2.