I took the current source from circuitikz and added the arrow from this answer (more or less).
The label location is determined by the borders of the components and [inner sep]
, so the easiest way to move the label is to just add space inside the label.
\documentclass[a4paper]{article}
\usepackage{tikz}
\usepackage[european]{circuitikz}
\makeatletter
\pgfcircdeclarebipole{}{\ctikzvalof{bipoles/isource/height}}{isource}{\ctikzvalof{bipoles/isource/height}}{\ctikzvalof{bipoles/isource/width}}{
\pgfpointorigin
\pgfsetlinewidth{\pgfkeysvalueof{/tikz/circuitikz/bipoles/thickness}\pgfstartlinewidth}
\pgfpathellipse{\pgfpointorigin}{\pgfpoint{0}{\pgf@circ@res@up}}{\pgfpoint{\pgf@circ@res@left}{0}}
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@step}{\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@step}{\pgf@circ@res@down}}
\pgfusepath{draw}
\pgfscope
\pgfsetarrowsend{latex'}
\pgfpathmoveto{\pgfpoint{0.8\pgf@circ@res@left}{1.2\pgf@circ@res@up}}
\pgfpathlineto{\pgfpoint{0.8\pgf@circ@res@right}{1.2\pgf@circ@res@up}}
\pgfusepath{draw} %draw arrow
\endpgfscope
}
\makeatother
\begin{document}
\begin{figure}[!ht]
\begin{circuitikz}
%\tikzset{every node/.style={inner sep=1em}}
\draw (0,0) to[I, l={$I_B$~},name=A] (0,2);
%\draw[red] (A.sw) rectangle (A.ne);
\end{circuitikz}
\end{figure}
\end{document}

For more control, replace the label with a node:
\begin{document}
\begin{circuitikz}
\draw (0,0) to[I, name=A] (0,2);
\node[left=2pt] at (A.n) {$I_A$};
\draw (0,0) to[I, name=B] (2,0);
\node[above=2pt] at (B.n) {$I_B$};
\end{circuitikz}
\end{document}